2017-01-28 6 views
0

Я выполнил следующий учебник и установил свой лазурный бэкэнд.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

{ "имя пользователя": "Adrian", "пароль": "supersecret"}

Json (application/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 
+0

Вы проходя тип содержимого в запросе? –

+0

Есть две ошибки, которые вы получаете, связанные с GET. Когда вы отправляете запрос POST с Content-Type = "application/json", какую ошибку вы получаете? –

ответ

0

Убедитесь в заголовках вашего запроса вы устанавливаете 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

+0

уже задал его как приложение/json в заголовке –

+0

Попробуйте обновленный ответ. –

+0

Пробовал, получая ту же ошибку –

0

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

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

+0

i уже сделали оба. Проблема сохраняется –

0

В Azure service api убедитесь, что это с [HttpPost]. Если вы можете отправить тело param, это означает, что вы выбрали Post в postman при вызове API, который является правильным. Не меняйте ни почтового корреспондента, ни лазурного 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