HttpClient POST到WEB API方法返回405(方法不允许)

时间:2017-05-16 09:04:12

标签: c# asp.net-web-api dotnet-httpclient

在调试会话中使用IIS Express和VS 2015中的Postman(浏览器)时,以下请求可以正常工作:

POST http://localhost:51072/api/cs/processor/process

{
'code':'TEST',
  'mode':0
}

这是我的web api控制器方法

[RoutePrefix("api/cs")]
public class ProcessorController : UmbracoApiController
{...

[AllowAnonymous]
[Route("processor/process")]
[HttpPost()]
public IHttpActionResult Process([FromBody] ProcessSurvey dto)
{
    if (!HttpContext.Current.Request.IsLocal)
    {
        return Content(HttpStatusCode.Forbidden, "Not allowed to start survey from remote host.");
    }
    ProcessSurveyResponse resp = new ProcessSurveyResponse();
    switch (dto.Code)
    {
        case "ITS":
            resp = Execute(dto.Mode);
            break;
        default:
            resp.Message = "Test successful!";
            break;
    }
    return Content(HttpStatusCode.Created, resp);
}

虽然当我尝试使用完全相同的请求数据访问此方法时,它返回405.在深入挖掘后,我发现内部已完成重定向(302)。但无法找到有关IIS日志中发生的事情以及原因的任何信息。

到目前为止,我已经删除了WebDAV,属性是Http而不是Mvc,路由配置的所有星座(belkow是我现在的星座)

    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();


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

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

这是我的init方法

    GlobalConfiguration.Configure(WebApiConfig.Register); //WebApi 2 Register method

真的不知道该怎么办...现在挣扎了2天,我不知道在哪里可以看得更远。

这是HttpClient调用

using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.ExpectContinue = false;
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
                var json = JsonConvert.SerializeObject(dto);
                StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
                log.Debug("Call " + baseUrl);
                HttpResponseMessage response = await client.PostAsync("http://localhost:51072/api/cs/surveyprocessor/process/", content);
                string data = await response.Content.ReadAsStringAsync();
                if (response.IsSuccessStatusCode)
                {
                    result = JsonConvert.DeserializeObject<ProcessSurveyResponse>(data);
                }
                else
                {
                    result.Message = data;
                }
                return result;
            }

这是我的DTO

public class ProcessSurvey
{
    [JsonProperty(PropertyName = "mode")]
    public int Mode { get; set; }
    [JsonProperty(PropertyName = "code")]
    public string Code { get; set; }
    [JsonProperty(PropertyName = "customers")]
    public IList<int> Customers { get; set; }
}

有趣的是,当我在HttpClient上发布POST时,它似乎没有到达WebApi模块...

> iisexpress.exe Information: 0 : Request, Method=GET,
> Url=http://localhost:51072/api/cs/surveyprocessor/process/?AspxAutoDetectCookieSupport=1,
> Message='http://localhost:51072/api/cs/surveyprocessor/process/?AspxAutoDetectCookieSupport=1'
> iisexpress.exe Information: 0 : Message='SurveyProcessor',
> Operation=NamespaceHttpControllerSelector.SelectController
> iisexpress.exe Information: 0 :
> Message='SSI.CSS.Serviceportal.CS.Controller.SurveyProcessorController',
> Operation=DefaultHttpControllerActivator.Create iisexpress.exe
> Information: 0 :
> Message='SSI.CSS.Serviceportal.CS.Controller.SurveyProcessorController',
> Operation=HttpControllerDescriptor.CreateController iisexpress.exe
> Information: 0 : Message='Will use same 'JsonMediaTypeFormatter'
> formatter',
> Operation=JsonMediaTypeFormatter.GetPerRequestFormatterInstance
> iisexpress.exe Information: 0 : Message='Selected
> formatter='JsonMediaTypeFormatter', content-type='application/json;
> charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate
> iisexpress.exe Warning: 0 : Message='UserMessage='The requested
> resource does not support http method 'GET'.'',
> Operation=ApiControllerActionSelector.SelectAction, Status=405
> (MethodNotAllowed), Exception=System.Web.Http.HttpResponseException:
> Processing of the HTTP request resulted in an exception. Please see
> the HTTP response returned by the 'Response' property of this
> exception for details.    bei
> System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext
> controllerContext)    bei
> System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext
> controllerContext)    bei
> System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.<>c__DisplayClass2.<System.Web.Http.Controllers.IHttpActionSelector.SelectAction>b__0()    bei
> System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter
> traceWriter, HttpRequestMessage request, String category, TraceLevel
> level, String operatorName, String operationName, Action`1 beginTrace,
> Action execute, Action`1 endTrace, Action`1 errorTrace) iisexpress.exe
> Warning: 0 : Message='UserMessage='The requested resource does not
> support http method 'GET'.'',
> Operation=SurveyProcessorController.ExecuteAsync, Status=405
> (MethodNotAllowed), Exception=System.Web.Http.HttpResponseException:
> Processing of the HTTP request resulted in an exception. Please see
> the HTTP response returned by the 'Response' property of this
> exception for details.    bei
> System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext
> controllerContext)    bei
> System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext
> controllerContext)    bei
> System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.<>c__DisplayClass2.<System.Web.Http.Controllers.IHttpActionSelector.SelectAction>b__0()    bei
> System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter
> traceWriter, HttpRequestMessage request, String category, TraceLevel
> level, String operatorName, String operationName, Action`1 beginTrace,
> Action execute, Action`1 endTrace, Action`1 errorTrace)    bei
> System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.System.Web.Http.Controllers.IHttpActionSelector.SelectAction(HttpControllerContext
> controllerContext)    bei
> System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext
> controllerContext, CancellationToken cancellationToken)    bei
> System.Web.Http.Tracing.Tracers.HttpControllerTracer.<ExecuteAsyncCore>d__5.MoveNext()
> --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---    bei
> System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task
> task)    bei
> System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
> task)    bei
> System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()
> iisexpress.exe Information: 0 : Response, Status=405
> (MethodNotAllowed), Method=GET,
> Url=http://localhost:51072/api/cs/surveyprocessor/process/?AspxAutoDetectCookieSupport=1,
> Message='Content-type='application/json; charset=utf-8',
> content-length=unknown' iisexpress.exe Information: 0 :
> Operation=JsonMediaTypeFormatter.WriteToStreamAsync iisexpress.exe
> Information: 0 : Operation=SurveyProcessorController.Dispose
> 'iisexpress.exe' (CLR v4.0.30319:
> /LM/W3SVC/2/ROOT-1-131394088034503203): Loaded
> 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET
> Files\root\4650863f\f01d951b\App_Web_ping.aspx.5f2dec3.f9ui73ad.dll'. 
> The thread 0x2830 has exited with code 0 (0x0). The thread 0x3f10 has
> exited with code 0 (0x0). The thread 0x2104 has exited with code 0
> (0x0).

1 个答案:

答案 0 :(得分:0)

将FormsAuth和SessionProvider模块中的cookieless =“AutoDetect”更改为 cookieless =“UseCookies”,一切都按预期工作。