C # Azure / Postman - ошибка метода 405 запрещена при POST

Я последовал следующему руководству и настроил свой лазурный сервер.

https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/custom/

Затем я впервые установил почтальона и установил:

http://apptest.azurewebsites.net/.auth/login/custom

{"username": "adrian", "password": "supersecret"}

Json (приложение / json)

Однако я продолжаю получать эту ошибку:

405 Метод запрещен

{
  "Message": "The requested resource does not support http method 'GET'."
}

Бэкэнд-код:

using System;
using System.IdentityModel.Tokens;
using System.Linq;
using System.Security.Claims;
using System.Web.Http;
using Newtonsoft.Json;
using AppTestService.Models;
using AppTestService.DataObjects;

using Microsoft.Azure.Mobile.Server.Login;


namespace AppTestService.Controllers
{
    [Route(".auth/login/custom")]
    public class CustomAuthController : ApiController
    {
        private AppTestContext db;
        private string signingKey, audience, issuer;

        public CustomAuthController()
        {
            db = new AppTestContext();
            signingKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY");
            var website = Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME");
            audience = $"https://{website}/";
            issuer = $"https://{website}/";
        }

        [System.Web.Http.HttpPost]
        public IHttpActionResult Post([FromBody] User body)
        {
            if (body == null || body.Username == null || body.Password == null ||
                body.Username.Length == 0 || body.Password.Length == 0)
            {
                return BadRequest();
            }

            if (!IsValidUser(body))
            {
                return Unauthorized();
            }

            var claims = new Claim[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, body.Username)
            };

            JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
                claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
            return Ok(new LoginResult()
            {
                AuthenticationToken = token.RawData,
                User = new LoginResultUser { UserId = body.Username }
            });
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool IsValidUser(User user)
        {
            return db.Users.Count(u => u.Username.Equals(user.Username) && u.Password.Equals(user.Password)) > 0;
        }


    }


    public class LoginResult
    {
        [JsonProperty(PropertyName = "authenticationToken")]
        public string AuthenticationToken { get; set; }

        [JsonProperty(PropertyName = "user")]
        public LoginResultUser User { get; set; }
    }

    public class LoginResultUser
    {
        [JsonProperty(PropertyName = "userId")]
        public string UserId { get; set; }
    }


}

Если я добавлю [System.Web.Http.HttpGet] поверх функции, я получу другую ошибку. :

415 Неподдерживаемый тип носителя.

{
  "Message": "The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource."
}

Это заголовки:

Allow →POST
Content-Length →72
Content-Type →application/json; charset=utf-8
Date →Sat, 28 Jan 2017 22:08:48 GMT
Server →Microsoft-IIS/8.0
X-Powered-By →ASP.NET

person Yanick Thomas    schedule 28.01.2017    source источник
comment
Вы передаете тип содержимого в своем запросе?   -  person Ali Baig    schedule 29.01.2017
comment
Вы получаете две ошибки, связанные с GET. Когда вы отправляете запрос POST с Content-Type = application / json, какую ошибку вы получаете?   -  person Chetan Ranpariya    schedule 29.01.2017


Ответы (3)


Вероятно, вы захотите сделать POST-запрос от PostMan вместо GET. Не добавляйте [HttpGet] к действию, просто установите метод POST в PostMan.

И убедитесь, что вы установили заголовок Content-Type: application/json в PostMan.

person juunas    schedule 28.01.2017

Убедитесь, что в заголовках вашего запроса вы устанавливаете ContentType = "application/json" в почтальоне или даже при создании запроса от любого клиента.

Измените определение вашего контроллера на

[RoutePrefix("auth/login/custom")]
public class CustomAuthController : ApiController
{
}

И просто для проверки введите маршрут в POST, например

[System.Web.Http.HttpPost]
[Route("post")]
public IHttpActionResult Post([FromBody] User body)

и попробуйте сделать запрос

http://apptest.azurewebsites.net/auth/login/custom/post

person Ali Baig    schedule 28.01.2017
comment
Это странно! Просто для целей тестирования попробуйте добавить [AllowAnonymous] в свой POST, если вы используете [Authorize] - person Ali Baig; 29.01.2017

Убедитесь, что в API службы Azure используется [HttpPost]. Если вы можете отправить параметр тела, это означает, что вы выбрали Post в почтальоне при вызове API, что является правильным. Не меняйте ни вызов почтальона, ни лазурный API, чтобы получить. это будет несоответствие.

Если у вас есть доступ к журналам Azure, проверьте, перенаправляется ли http Post на URL-адрес https как Get, в этом случае попробуйте позвонить по https напрямую.

Журналы Azure в этом случае выглядят следующим образом:

Received request: POST http://xxx.azurewebsites.net/api/Data/test
Information Redirecting: https://xxx.azurewebsites.net/api/Data/test
Received request: GET https://xxx.azurewebsites.net/api/Data/test

в этом случае вызовите https://xxx.azurewebsites.net/api/Data/test

person Snehal R. Todkar    schedule 23.06.2017