2012-01-25 4 views
1

WCF 웹 API 미리보기 6을 사용하여 웹 API를 작성 중이지만 현재 약간의 문제가 있습니다. 어떤 사용자가 요청을 수행했는지 확인하기 위해 작업에 IPrincipal을 주입하는 작업 처리기를 갖고 싶습니다. 이미 해당 작업 처리기가 있고 이미 구성되어 있습니다.작업 처리기 WCF 웹 API가 제대로 작동하지 않습니까?

HttpOperationHandlerFactory이어야 입력 매개 변수를 확인할 수 없습니다 :하지만 내가 WebInvoke의 속성과 함께 작업을 장식하고 동시에 작업이 IPrincipal과 다른 도메인 오브젝트를 수신 할 때, 시스템이 말해 예외를 throw하는 것으로 나타났습니다 서비스 조작 'NameOfTheOperation'에 대한 요청 메시지 컨텐츠와 연관된다. 작업에서 요청 메시지의 내용을 예상하지 않으면 HTTP GET 메서드를 작업과 함께 사용하십시오. 그렇지 않으면, 그 하나 개의 입력 매개 변수를 확인 중 하나가 바로 그거야로 설정 IsContentParameter 재산 '참'또는 다음 중 하나에 할당 할 유형입니다 : HttpContent, ObjectContent 1, HttpRequestMessage or HttpRequestMessage 1.

내가 여기서 무슨 일이 일어나고 있는지 몰라. 몇 가지 배경을 제공하기 위해 내가 코드를 게시하여 내가 어떻게해야하는지 알려줍니다.

동작 : 나는 사용자 정의 인증 속성과 함께 작업을 장식 때문에 IPrincipal를 주입 할 때

[WebInvoke(UriTemplate = "", Method = "POST")] 
    [Authorization(Roles = "")] 
    public HttpResponseMessage<dto.Diagnostic> RegisterDiagnostic(dto.Diagnostic diagnostic, IPrincipal principal) 
    { 
     ...... 
    } 

WCF 웹 API는 알고있다.

글로벌 파일의 구성은 : 그것이 사용자 정의 인증 attibute로 장식되어있어 경우

var config = new WebApiConfiguration() {EnableTestClient = true}; 
     config.RegisterOAuthHanlder(); //this is an extension method 
     routes.SetDefaultHttpConfiguration(config); 

     routes.MapServiceRoute<MeasurementResource>("Measurement"); 
     routes.MapServiceRoute<DiagnosticResource>("Diagnostic"); 

그런 다음 RegisterOAuthHandler 방법은 작업에 작업 핸들러를 추가합니다.

public static WebApiConfiguration RegisterOAuthHanlder(this WebApiConfiguration conf) 
    { 
     conf.AddRequestHandlers((coll, ep, desc) => 
     { 
      var authorizeAttribute = desc.Attributes.OfType<AuthorizationAttribute>().FirstOrDefault(); 
      if (authorizeAttribute != null) 
      { 
       coll.Add(new OAuthOperationHandler(authorizeAttribute)); 
      } 
     }); 
     return conf; 
    } 

    public static WebApiConfiguration AddRequestHandlers(
     this WebApiConfiguration conf, 
     Action<Collection<HttpOperationHandler>, ServiceEndpoint, HttpOperationDescription> requestHandlerDelegate) 
    { 
     var old = conf.RequestHandlers; 
     conf.RequestHandlers = old == null ? requestHandlerDelegate : (coll, ep, desc) => 
     { 
      old(coll, ep, desc); 
     }; 
     return conf; 
    } 

누군가가 이것 좀 도와 줄래이는 모습입니다? 미리 감사드립니다!

답변

3

Diagnostic 매개 변수를 ObjectContent에 포장하십시오. 즉 ObjectContent<Diagnostic>입니다. 그런 다음 ReadAs() 메서드를 사용하여 객체를 꺼냅니다.

제대로 작동합니다.

+0

위대한 !! 그것은 일했다! – Daniel

+0

잘 알고 있습니다! 통합 MVC 스택에서 이러한 문제가 발생하지 않을 것입니다. –

관련 문제