programing

메서드 매개 변수에서 WCF webHttpBinding 오류가 발생했습니다."래퍼 요소 없이 최대 하나의 본문 매개 변수를 직렬화할 수 있습니다."

skycolor 2023. 3. 13. 20:20
반응형

메서드 매개 변수에서 WCF webHttpBinding 오류가 발생했습니다."래퍼 요소 없이 최대 하나의 본문 매개 변수를 직렬화할 수 있습니다."

contract "의 연산 "은 래퍼 요소 없이 직렬화할 여러 요청 본문 파라미터를 지정합니다.래퍼 요소 없이 최대 1개의 본문 매개 변수를 직렬화할 수 있습니다.WebGetAttribute/WebInvokeAttribute에서 추가 본문 파라미터를 삭제하거나 BodyStyle 속성을 Wraped로 설정합니다.

다음 설정(WCF Config Editor에서 설정)을 통해 JSON을 사용하는 C# 4.0 WCF 서비스를 공개하려고 합니다.

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="iPhoneAPI.API">
        <endpoint address="" behaviorConfiguration="NewBehavior0" binding="webHttpBinding"
          bindingConfiguration="" contract="iPhoneAPI.IApi" />
      </service>
    </services>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding" bindingConfiguration="" />
    </protocolMapping>
    <behaviors>
      <endpointBehaviors>
        <behavior name="NewBehavior0">
          <webHttp defaultOutgoingResponseFormat="Json" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
</configuration>

/API.svc에 접속하면 앞에서 설명한 예외 메시지가 나타납니다.

다음(파라미터 없음) 계약만 지정하면 서비스는 작동합니다.

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "test")]
GenericApiResult<IEnumerable<LiveFeedEntity>> test();

스트링이 아닌 파라미터가 필요한 메서드가 있는 경우 앞에서 설명한 예외가 발생합니다.

예:

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login")]
LoginApiResult Login(String UserName, String Password);

이 기능을 다음과 같이 변경할 경우:

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}/{Password}")]
LoginApiResult Login(String UserName, String Password);

동작하지만 이는 Type String 파라미터에 대해서만 가능합니다.다음과 같은 다른 기능에 대해 이 문제를 해결하려면 어떻게 해야 합니까?

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "logout")]
GenericApiResult<bool> Logout(Guid SessionKey);

많은 구글 검색을 시도했지만 빈손으로 발견되어 어떤 도움도 감사하게 생각합니다.

건배.

닉.

WebInvokeAttribute를 설정해 본 적이 있습니까?오류에 따라 BodyStyle에서 Wraped로 변경하시겠습니까?

문제는 UriTemplate가 1개를 제외한 모든 값을 지정해야 한다는 것입니다.문자열 이외의 복잡한 타입은 파라미터로 해도 상관없습니다.경량 json 오브젝트를 자주 서비스에 보내드리기 때문에 문제 없습니다.다음은 마지막 예를 사용한 예입니다.

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "logout")]
GenericApiResult<bool> Logout(Guid SessionKey);

전달되는 파라미터는 1개뿐이고 URL 파라미터로 전달되지 않기 때문에 포스트 본문에 있을 것으로 예상되지만 하나의 바디 파라미터(URL이 아닌 포스트 본문에 전달되는 파라미터)만 전달할 수 있습니다.

이렇게 첫 번째 방법을 변경할 수 있습니다.

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}")]
LoginApiResult Login(String UserName, String Password);

패스워드는 포스트 본문에 입력됩니다.이 예에서 가장 좋은 방법은 다음과 같이 두 번째 예에서 수행한 작업을 수행하는 것입니다.

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "login/{UserName}/{Password}")]
LoginApiResult Login(String UserName, String Password);

이해 하셨나요?기본적으로 전달된 값은 모두 URL 파라미터로 표현해야 합니다.단, 포스트 본문으로 전달 가능한 값은 제외합니다.포스트 본문에 여러 개의 값이 전달되어야 하는 경우 필요한 여러 값을 가진 경량 개체를 만들고 포스트 본문에 해당 개체 전체를 수용합니다.

시켜야 할 WCF를 .BodyStyle로로 합니다.Wrapped.

따라서 귀사의 경우 운영 계약을 다음과 같이 변경해야 합니다.

[WebInvoke(Method = "POST", UriTemplate = "evals", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
void SubmitVideoPOST(Video videoArg, string userId);

출처 : 여기를 클릭

언급URL : https://stackoverflow.com/questions/5820306/wcf-webhttpbinding-error-with-method-parameters-at-most-one-body-parameter-can

반응형