C# Azure / Пощальон - 405 Методът не е разрешен грешка при POST

Следвах следния урок и настроих своя лазурен бекенд.

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

След това инсталирах пощальон за първи път и зададох:

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

{"потребителско име": "адриан", "парола": "суперсекретно"}

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

Въпреки това продължавам да получавам тази грешка:

405 Методът не е разрешен

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

Backend код:

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]. Ако можете да изпратите body param, това означава, че сте избрали Post in postman, докато извиквате API, което е правилно. Не променяйте обаждането на пощальон или azure api, за да получите. ще бъде несъответствие.

Ако имате достъп до регистрационни файлове на azure, проверете дали http Post е пренасочен към https url като 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