10

MVC'ye oldukça yeniyim, bu yüzden benim sorunum için bir çözüm bulunmasını umuyorum. MVC web API'm ile iletişim kurmak için üçüncü taraf donanım kullanıyorum. Donanım, istekleri mükemmel bir şekilde çıkarabilen bir JSON biçiminde gönderir. Bununla birlikte, bu taleplerin parametrelerini çatışmalar nedeniyle bağlayıcı model nesnelere dönüştürme sürecindeyim.MVC POST isteği için içerik üstbilgileri geçersiz kılın

E.G. ikisi de aynı denetleyicisi bulunmayan böylece

 Public Function POSTRequest(Action As String, Stamp As String) As HttpResponseMessage 
      ... 
     End Function 

     Public Function POSTRequest(Action As String, OpStamp As String) As HttpResponseMessage 
      ... 
     End Function 

Yani bu iki yöntemin aynı arama kartı paylaşır.

Bu nedenle, bu parametreleri yerleştirmek için model bağlama nesneleri oluşturdum. Sorun şu ki, bunu yaptıktan sonra, web API'sı "İçerik Türü" nin tanımlanmadığını söyleyen istek hakkında şikâyet ediyor. Buna bakacak olursak, üçüncü taraf donanımlar istekle birlikte içerik türü göndermez. Ağa baktığımda, bunun, tarayıcıda "application/octet-stream" içerik türü olarak işlenmesiyle sonuçlandığını buldum. Bu daha sonra bunu parametre olarak tanımlanan ciltleme nesnesine çeviremez.

Üçüncü taraf donanım üzerinde NO denetimimiz yoktur, bu nedenle bu isteklerin içerik türünü tanımlayamayız. Öyleyse, sorum şu, bu istekleri engellemek ve onlara içerik türü eklemek için bir yol var mı? Ya da bunun başka bir yolu?

cevap

5

Sanırım bir ActionFilterAttribute kullanabilirsiniz. Dökümanlara bakınız: Creating Custom Action Filters. Sizin durumunuzda, aşağıdaki örneği kullanabilirsiniz (VB yeteneklerim eski olduğundan C# 'de). uygulama/json değeri ile Content-Type üstbilgisi isteğini geçersiz kılar. Lütfen her türlü HttpContent'u desteklemek için geliştirmeniz gerektiğini unutmayın (örneğin, bunun MultiPart istekleri için kullanılması gerektiğini düşünmüyorum).

public class UpdateRequestAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     actionContext.Request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 
     base.OnActionExecuting(actionContext); 
    } 
} 

Sonra örneğin, kontrolör sınıfına bu özelliği ekleyin:

[UpdateRequest] 
public class HomeController : ApiController 
{ 
    //[...] 
} 

Bu durumda Ana kontrolöre tüm istekleri onların Content-Type geçersiz olacaktır.


Alternatif olarak, aynı zamanda çok erken boru hattı denir ve belirli bir denetleyiciye sınırlı olmayacak özel bir HTTP Message Handlers yazabilir. İsteğin sunucu tarafından nasıl işlendiğini anlamak için aşağıdaki resmi kontrol edin.

ASP.net Server Side handlers

şu anda boş ise Örneğin, bu ileti işleyicisi isteği Content-Typeuygulamaya/json ayarlayacaktır. Rota attribute.This tanımlayarak

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MessageHandlers.Add(new CustomMessageHandler()); 

     // Other configuration not shown... 

    } 
} 
1

Bir aynı denetleyici içinde bu yöntemlerin her ikisi de olabilir: Nihayet

public class CustomMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Content.Headers.ContentType == null) 
     { 
      request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 
     } 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

, burada boru hattına mesajınız işleyicisi eklemek amacıyla WebApiConfig güncellemek için nasıl Model Binding özniteliklerini önleyebilirsiniz.

[Route("Request1")] 
Public Function POSTRequest(Action As String, Stamp As String) As HttpResponseMessage 
      ... 
     End Function 
     [Route("Request2")] 
     Public Function POSTRequest(Action As String, OpStamp As String) As HttpResponseMessage 
      ... 
     End Function 

sizin webapiconfig.vb dosyasında MapHttpAttributeRoutes ekleyerek yönlendirme Özellik etkinleştirmek unutmayın

Public Module WebApiConfig 
    Public Sub Register(ByVal config As HttpConfiguration) 
     ' Web API configuration and services 

     ' Web API routes 
     config.MapHttpAttributeRoutes() 

     config.Routes.MapHttpRoute(
      name:="DefaultApi", 
      routeTemplate:="api/{controller}/{id}", 
      defaults:=New With {.id = RouteParameter.Optional} 
     ) 
    End Sub 
End Module