2017-05-16 1 views
2

Suite à la demande fonctionne parfaitement lorsque vous utilisez Postman (navigateur) dans IIS Express et VS 2015 dans une session de débogage:HttpClient POST à ​​la méthode de l'API WEB retourne 405 (Méthode non autorisée)

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

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

Ceci est mon contrôleur api web méthode

[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); 
} 

Bien que lorsque je tente d'accéder à cette méthode avec les données exactes même demande, il retourne une 405. Après avoir creusé plus profond que j'ai trouvé qu'il est fait en interne une redirection (302). Mais ne peut pas trouver des informations sur ce qui se passe et pourquoi dans les journaux IIS.

Ce que je l'ai fait jusqu'à présent est WebDAV supprimé, l'attribut est Http pas Mvc, toutes les constellations de configuration de la route (belkow est mon actuel)

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 } 
     ); 
    } 

et ceci est ma méthode init

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

Vraiment je ne sais pas quoi faire ... en difficulté depuis 2 jours maintenant et je ne sais pas où chercher plus loin.

Voici l'appel 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; 
      } 

Et voici mon 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; } 
} 

Ce qui est intéressant que quand je poste sur le HttpClient il semble qu'il n'atteint pas le module 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). 
+0

Comment essayez-vous d'accéder à cette méthode avec exactement les mêmes données de requête quand elle renvoie un 405? Cette partie n'est pas claire. Montrez comment le client http dans un [mcve] peut être utilisé pour reproduire le problème. – Nkosi

+0

J'ai modifié mon message – nhaberl

+0

Je vois 'surveyprocessor' dans l'URL appelée mais' processor' dans le code du contrôleur. Est-ce une faute de frappe? ou appelez-vous la mauvaise URL? – Nkosi

Répondre

0

Modifié cookieless = "AutoDetect" dans FormsAuth et le module SessionProvider à cookieless = "UseCookies" et tout fonctionne comme prévu.