2015-02-24 20 views
7

Bir ASP.NET Web API projede bir denetleyicisinde aşağıdaki eylem yöntemleri var: nedeniyle bir javascript hataASP.NET Web Api 200 Tamam döndürür 404

[Route("api/v2/project/{projectId}/stuff"), HttpGet] 
public IHttpActionResult Get(int projectId) 

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpGet] 
public IHttpActionResult Get(int projectId, [FromUri] Guid id) 

[Route("api/v2/project/{projectId}/stuff"), HttpPost] 
public IHttpActionResult Post(int projectId, [Required] Stuff stuff) 

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpPut] 
public IHttpActionResult Put(int projectId, [FromUri] Guid blastId, Stuff stuff) 

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpDelete] 
public IHttpActionResult Delete(int projectId, [FromUri] Guid id) 

, yaptığım bir kimliği için

api/v2/project/1234/stuff/undefined 

yani yerine bir GUID için DELETE istek, ben dize "undefined" var. Anlayabildiğim kadarıyla, bu benim rotalarımın hiçbiri ile eşleşmemeli, ancak(veya 405 Method not allowed) yerine yanıt olarak bir 200 OK aldım.

Bu eylem yöntemlerinin her birinde bir kesme noktası belirledim ve Fiddler'ı kullanarak isteği yineledim, ancak kesme noktalarının hiçbiri vurulmadı. WebApiRouteDebugger paketini nuget'ten yüklemeyi de denedim, ancak DI kapsayıcımızla bir şeyler yapan özel bir denetleyici fabrikası kullanıyoruz, bu yüzden hiç işe yaramayabilirdim. (Geçerli URL'lerin gereken başka istek yapmak gibi)

throw new Exception(actionContext.ControllerContext.ControllerDescriptor.ControllerName + 
" " + actionContext.ActionDescriptor.ActionName); 

ama DELETE istek hala200 OK için geçer: Ben bile küresel kayıtlı filtrelerden birini aşağıdaki durum atma çalıştı.

Bunu başka nasıl giderebilirim? Kök sebep ne olabilir? senin Global.asax.cs yılında

+1

Yeni Web APi projesi oluşturdum ve yöntemleriniz ile denetleyici ekledim ve testler için yönlendirme yaptım. Maalesef iyi çalışıyor. Url 'api/v2/project/{proje kimliği}/stuff/{id: guid}' 404 hatam var. Ben diğer denetleyicide yanlış yönlendirme veya "tanımsız" ile başka bir yol için eşleşmeleri ile sorun olduğunu düşünüyorum. –

+0

@BartoszCzerwonka: Bunu yapmak için zaman ayırdığınız için çok teşekkürler. Proje büyüktür, bu yüzden tüm rotaları tüm projeye dahil etmedim - ancak, dikkatli bir şekilde kontrol ettim ve projede hiçbir şey "api/v2/project/{ Bu denetleyicide hariç olmak üzere projectId}/stuff/ '. –

+0

Ayrıca, bunlardan sadece bir tanesi 'DELETE 'isteklerini kabul etmesi gereken bir tane var - ve bu, herhangi bir kesme noktasının vurulmadığı nokta. –

cevap

3

sizin protected void Application_Start(object sender, EventArgs e), aşağıdakileri ekleyin nerede dosyası:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
    } 

Tüm sunucu istekleri buradan gelmelidir.

Kullanmıyorsanız, bunları ekleyin.

using System.Web.Compilation; 
using System.Reflection; 

Başlatma isteğinde, tüm etkin yolları listelemek için bu kodu ekleyin.

 string Items = ""; 
     IEnumerable<Assembly> Assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>(); 

     foreach (Assembly FoundAssembly in Assemblies) 
     { 
      string AssemblyName = FoundAssembly.FullName; 
      IEnumerable<TypeInfo> Types = FoundAssembly.DefinedTypes.Where(type => type != null && type.IsPublic && type.IsClass && !type.IsAbstract && typeof(ApiController).IsAssignableFrom(type)); 
      foreach (TypeInfo ControllerType in Types) 
      { 
       System.Web.Http.Controllers.ApiControllerActionSelector ApiControllerSelection = new System.Web.Http.Controllers.ApiControllerActionSelector(); 
       System.Web.Http.Controllers.HttpControllerDescriptor ApiDescriptor = new System.Web.Http.Controllers.HttpControllerDescriptor(new System.Web.Http.HttpConfiguration(), ControllerType.Name, ControllerType); 
       ILookup<string, System.Web.Http.Controllers.HttpActionDescriptor> ApiMappings = ApiControllerSelection.GetActionMapping(ApiDescriptor); 

       foreach (var Maps in ApiMappings) 
       { 
        foreach (System.Web.Http.Controllers.HttpActionDescriptor Actions in Maps) 
        { 
         Items += "[ controller=" + ControllerType.Name + " action=" + ((System.Web.Http.Controllers.ReflectedHttpActionDescriptor)(Actions)).MethodInfo + "]"; 
        } 
       } 
      } 
     } 

Bu, tüm denetleyicileri ve imzalarını listeler. URL'niz bunlardan herhangi birine uymuyorsa, listeyi denetleyici olmayan yolları da içerecek şekilde genişletmeniz gerekebilir. Ben

+0

Projemizdeki diğer bazı değişiklikler, meydana geldiğinden beri sorunu yeniden üretemedi; Ancak, sorun giderme için bu öneri sorunu yeniden ortaya çıkması gerektiğinde kullanacağından emin olacağım. Bahşiş için çok teşekkür ederim - size% 1000 tekrar artışı vermekten mutluluk duyuyorum :) –

0

senin yönlendirme emin değilim ama eşlemenizde eylemleri içermeyen bir yönlendirme var: bunun için

api/v2/project/1234/stuff/undefined 

Kontrol web api yapılandırma: api/{controller}[/{action}]/{id}. Yapacağınız eylemle başka bir rota eylemine (GET gibi) vurabileceğinizi düşünüyorum.

P.S. Cevabı güncellemek için rota yapılandırmanızı gönderin.

1

Aynı sorunu yaşadım. Benim startup.cs ben yöntemi

app.Run(async context => 
     { 
      context.Response.ContentType = "text/plain"; 
      await context.Response.WriteAsync("My Api"); 
     }); 

Bu, tüm yolları dize ile birlikte 200 yanıt almayı neden oluyordu vardı. Sadece bu yanıtı başlangıçta göstermek istedim. Bu çözümdü.Aynı Başlangıç ​​sınıfında

private void StartupPage(IAppBuilder app) 
    { 
     app.Run(async (context) => 
     { 
      context.Response.ContentType = "text/plain"; 
      await context.Response.WriteAsync("My Api"); 
     }); 
    } 

bir istek taban url üzerinde yapıldığında sadece 200 OK mesajı döndürür bir yöntemle birlikte

app.MapWhen(ctx => ctx.Request.Path.Value == "/", StartupPage); 

.

İlgili konular