2016-01-28 2 views
5

У меня есть контроллер Web Api. Это ведет себя очень странно. Когда я использую PostMan, я могу получить доступ к методу POST в Web Api, но когда я использую HttpWebRequest из .net, он возвращает (405) Метод не разрешен. я поставил код Web Api здесь:ASP.NET WebApi: (405) Метод не разрешен

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web; 
using System.Web.Http; 

namespace MyProject.Controllers 
{ 
    public class TestController : ApiController 
    { 
     [HttpPost] 
     public int buy(OrderResult value) 
     { 
      try 
      { 
       if (value.InvoiceDate != null && value.Result == 1) 
       { 
        return 0; 
       } 
      } 
      catch{} 

      return -1; 
     } 
    } 

    public class OrderResult 
    { 
     public int Result { get; set; } 
     public long InvoiceNumber { get; set; } 
     public string InvoiceDate { get; set; } 
     public long TimeStamp { get; set; } 
    } 
} 

Вот мой WebApiConfig.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 

namespace MyProject 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional } 
      ); 

     } 
    } 
} 

Это, как я отправить запрос POST из другого .NET проекта:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Web; 

namespace MyProject.Controllers 
{ 
    public static class WebReq 
    { 
     public static string PostRequest(string Url, string postParameters) 
     { 
      try 
      { 
       HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(Url); 
       myReq.Method = "POST"; 
       myReq.Timeout = 30000; 
       myReq.Proxy = null; 

       byte[] postData = Encoding.UTF8.GetBytes(postParameters); 
       myReq.ContentLength = postData.Length; 
       myReq.ContentType = "application/x-www-form-urlencoded"; 
       using (Stream requestWrite = myReq.GetRequestStream()) 
       { 
        requestWrite.Write(postData, 0, postData.Length); 
        requestWrite.Close(); 
        using (HttpWebResponse webResponse = (HttpWebResponse)myReq.GetResponse()) 
        { 
         if (webResponse.StatusCode == HttpStatusCode.OK) 
         { 
          using (Stream str = webResponse.GetResponseStream()) 
          { 
           using (StreamReader sr = new StreamReader(str)) 
           { 
            return sr.ReadToEnd(); 
           } 
          } 
         } 
         return null; 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       var message = e.Message; 
       return null; 
      } 
     } 

    } 
} 

Я уже добавил следующий код в своем web.config:

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule" /> 
</modules> 

Странно, потому что я могу успешно отправить запрос POST из PostMan. PostMan отправляет этот код в API.

POST /api/Test/buy HTTP/1.1 
Host: domain.com 
Cache-Control: no-cache 
Postman-Token: 9220a4e6-e707-5c5f-ea61-55171a5dd95f 
Content-Type: application/x-www-form-urlencoded 

InvoiceDate=28012016&Result=1 

Буду признателен за любые предложения по решению проблемы.

ответ

1

Я нашел решение.

Я проверил просьбу Fiddler.When я отправить запрос POST к API автоматически перенаправлять на тот же адрес с этим новым параметром AspxAutoDetectCookieSupport=1

How to remove AspxAutoDetectCookieSupport=1

Наконец я изменил cookieless="AutoDetect" в web.config для cookieless="UseCookies" и проблема решена.

1
 byte[] postData = Encoding.UTF8.GetBytes(postParameters); 
      myReq.ContentLength = postData.Length; 
      myReq.ContentType = "application/x-www-form-urlencoded"; 
      using (Stream requestWrite = myReq.GetRequestStream()) 
      { 
       requestWrite.Write(postData, 0, postData.Length); 

Вы, скорее всего, не отправите надлежащий запрос x-www-form-urlencoded. Вероятно, вы не кодируете данные должным образом из того, что передается как postParameters. См. Post form data using HttpWebRequest

Поскольку вы не создаете действительный объект OrderResult в соответствии с x-www-form-urlencoded, селектор маршрута не выбирает ваше действие Buy. Вот почему вы получаете POST не допускается.

Возможно, вы перейдете к контроллеру, если вы изменили OrderResult value = null, так как теперь он является необязательным параметром. Однако это не то, что вы хотите, если вы не будете иметь странный контроллер, который ведет себя как:

Buy(OrderResult value = null) 
{ 
    if(value== null) 
     value = MyCustomDeserializeFromRequestBody(RequestContext) 

    ... 
} 

В конечном итоге вы просто действительно не должны использовать этот класс есть намного лучшие конструкции для современного развития https://stackoverflow.com/a/31147762/37055https://github.com/hhariri/EasyHttp от верхней части головы

-1

Поймайте свой запрос с помощью скрипача или чего-то подобного, вероятно, вы отправляете метод «ОПЦИИ».

, что связано с CORS, так что я думаю, что для вас решение будет включить Корс на WebAPI

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

+1

Это не проблема CORS, это была моя первая мысль, но OP работает исключительно с сервера/приложения, а не в браузере + ajax. –

+0

Aaa да, вы правы .. извините: D – hellwd

Смежные вопросы