10

나는 MVC에 상당히 익숙하므로 문제에 대한 해결책이 있기를 바랍니다. 타사 하드웨어를 사용하여 MVC 웹 API와 통신하고 있습니다. 하드웨어는 요청을 JSON 형식으로 보내는데 완벽하게 추출 할 수 있습니다. 그러나 충돌로 인해 이러한 요청의 매개 변수를 바인딩 모델 개체로 변경하는 중입니다.MVC POST 요청에 대한 내용 헤더 오버라이드

E.G.

이 두 가지 방법은 동일한 전화 카드를 공유하므로 둘 다 같은 컨트롤러에 존재할 수 없습니다.

이 때문에 필자는 모델 바인딩 개체를 만들어 이러한 매개 변수를 대신 저장했습니다. 문제는 일단 이렇게하면 웹 API는 "Content-Type"이 정의되어 있지 않다는 요청에 대해 불평합니다. 그것을 보면 타사 하드웨어가 요청과 함께 콘텐츠 유형을 보내지 않습니다. 인터넷을 살펴보면 브라우저에서 콘텐츠 유형 "application/octet-stream"으로 처리하는 결과를 낳았습니다. 그런 다음이를 매개 변수로 정의 된 바인딩 객체로 변환 할 수 없습니다.

우리는 타사 하드웨어를 제어 할 수 없으므로 이러한 요청에 대한 콘텐츠 형식을 정의 할 수 없습니다. 그래서, 내 질문은, 거기에 이러한 요청을 가로 채고 그들에게 콘텐츠 형식을 추가하는 방법은 무엇입니까? 아니면이 문제를 해결하는 또 다른 방법이 있을까요?

답변

5

ActionFilterAttribute을 사용할 수 있다고 생각합니다. 문서 : Creating Custom Action Filters을 참조하십시오.

귀하의 경우, VB에서 기술이 오래 되었기 때문에 C#에서 다음 샘플을 사용할 수 있습니다. 모든 요청은 헤더를 application/json 값으로 대체합니다. 모든 종류의 HttpContent을 지원하려면이 기능을 향상시켜야 할 수도 있습니다 (예 : MultiPart 요청에 사용해서는 안 됨).

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

은 그럼 당신은 예를 들어, 컨트롤러 클래스에이 속성을 추가

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

이 경우 홈 컨트롤러에 대한 모든 요청은 자신의 Content-Type을 무시해야합니다.


또는, 당신은 또한 초기 파이프 라인라고하며 특정 컨트롤러에 국한되지 않습니다 사용자 정의 HTTP Message Handlers를 작성할 수 있습니다. 서버에서 요청을 처리하는 방법을 이해하려면 다음 그림을 확인하십시오.

ASP.net Server Side handlers

가 현재 비어있는 경우 예를 들어,이 메시지 핸들러는 요청 Content-Type응용 프로그램/JSON을 설정합니다. 경로 attribute.This을 정의하여

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

     // Other configuration not shown... 

    } 
} 
1

당신은 동일한 컨트롤러에서 이러한 방법 모두를 가질 수 있습니다 : 마지막으로

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

, 여기에 파이프 라인에 메시지 처리기를 추가하기 위해 WebApiConfig을 업데이트하는 방법입니다 모델 바인딩 특성을 피할 수 있습니다.

[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 

은 webapiconfig.vb 파일에 MapHttpAttributeRoutes을 추가하여 라우팅 특성을 가능하게하는 것을 잊지 마세요

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 
관련 문제