2009-06-17 8 views
6

svcutil.exe를 사용하여 WCF 프록시를 생성하여 WSDL을 사용하여 지정된 웹 서비스를 사용하려고하지만 WSDL은 일부 작업에 선택적 매개 변수가 있음을 지정합니다 에 minOccurs = "0"), 예를 들어 :svcutil.exe - null 가능 필드를 허용하지 않는 프록시 생성

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 

불행하게도, 생성 된 프록시 날 값 (매개 변수가 널 (NULL) 없습니다) 지정하지 수 없습니다, 그리고 더 "지정"필드의 한 부분으로 존재하지 프록시에게 값을 보내지 말 것을 명령하는 호출

svcutil을 사용하여이 작업을 수행 할 수있는 프록시를 생성하는 방법이 있습니까?

(부수적으로, 다른 사람들이 "추가 서비스 참조"기능을 사용하여 이러한 추가 "지정된"필드를 올바르게 생성 할 수 있었지만 Visual Studio가 원하지 않는 이유가 무엇인지 알게되었습니다. 내가 참조를 추가 한 후 (아무것도 이후 일어나지))

WSDL File Generated Proxy

명령이 사용하는 프록시를 생성합니다 http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl/내부 /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs/설정는 svcutil : App.config/nologo

+0

SvcUtil은 일반적으로 PITA이며 사용하지 않지만 내 서비스와 WCF를 사용하므로 훨씬 쉽게 작업 할 수 있습니다. –

+0

Specified 속성이 생성되지 않는 것은 이상합니다 ... 이것은 optionnal 값 유형을 처리하는 WCF 방법입니다. svcutil에서 제공하는 오류가 없습니까? 그렇지 않다면, WSDL 파일과 생성 된 것을 제공 할 수 있습니까? – Philippe

+0

WSDL은 다음 위치에서 사용할 수 있습니다. http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl 다음 명령을 사용하여 프록시를 생성합니다. svcutil http://sas-int.elluminate.com/site/external/adapter/default/v1/webservice.wsdl/internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs/config :. . \ App.config/nologo 생성되는 내용은 다음과 같습니다. http://pastebin.com/m20688d39 고마워요! – David

답변

6

svcutil에 의해 생성 된 클라이언트 프록시 클래스는 유형의 meetingId이라는 필드/속성이 있다고 생각합니다. 맞습니까? 예, 이것은 nullable이 아닙니다. 그러나 meetingIdSpecified이라는 부울 필드/속성이 있습니다.이 서비스가 true으로 설정되어있는 경우에만 서비스에서 실제로 보게됩니다. 설정하지 않으면 서비스가 값을 보지 않으므로 마치 거의 NULL과 같습니다.

또한 XSD에서 필드를 Nullable로 지정하지 않았 으면 선택 사항으로 지정했습니다. nullable로 만들려면 다음 구문을 사용하십시오.

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" 
      nillable="true" /> 

"nullable"속성을 참조하십시오. 즉 필드는 정말 널 (NULL) 제조에 사용되는 하나 - 당신은 지금 당신의 XML이 같은 항목을 가질 수는 minOccurs는 = "0"을하지 수 있도록해야하기 때문에이 문제가

+0

지정된 필드가 표시되지 않지만 nillable에 대한 것입니다 ... WSDL에 추가하면 svcutil이 수행합니다. 호출에 대해 nullable 매개 변수를 올바르게 생성합니다. 감사합니다 – David

+0

나는 요소가 선택적 (minOccurs = "0")이고 의도적으로 nillable이 아닌 경우가 있습니다. 또한 "/ serializer : XmlSerializer"명령 줄 옵션을 포함하지 않으면 "지정된"필드가 표시되지 않습니다. 기본 DataContractSerializer가이 상황을 올바르게 처리하지 않는다고 생각합니다 ...? DataContractSerializer 코드를 얻는 유일한 방법은 DataMemberAttribute에서 EmitDefaultValue = "false"를 지정하기 위해 생성 된 코드를 수동으로 수정하는 것이지만 결석으로 해석 될 수 있으므로 0을 보낼 수 없습니다. 값. – ALEXintlsos

1

SVCUtil이 작동하지 않는 경우 SVCUtil을 사용하지 마십시오. 서비스가 그리 복잡하지 않은 경우 수동으로 서비스 인터페이스를 작성하고 ChannelFactory <>을 사용하여 프록시를 만들 수 있습니다.

+0

내가 svcutil을 사용하기를 바랬던 주된 이유는 시간을 절약하는 것이 었습니다. 모든 것을 신속하게 충분히 구현할 수 있을지 확신 할 수 없습니다. – David

+0

(몇 년 후)이 방법에 대한 링크가 있습니까? –

+0

어떤 방법? (컨텍스트 중, 몇 년 후) –

0

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <meetingId xsi:nil="true" /> 
</root> 

마크 'meetingId'값을 내고 생성 된 프록시가 허용하지 않습니다.

서비스 만 사용하므로 wsdl을 제어 할 수 없으며 프록시에서 'meetingId'옵션을 사용하려면 wsdl에 nillable = "true"를 추가 할 수 없습니다.

svcutil.exe가 아닌 wsdl.exe를 사용하여 프록시를 생성하는 경우 meetingId 필드를 생성할지 여부를 선택할 수있는 추가 필드 'meetingIdSpecified'가 있습니다.

wsdl.exe http:///myservice?wsdl 

그러나 wsdl.exe를 사용하면 WCF가 아닌 asp.net 웹 서비스로 서비스를 이용할 수 있습니다.당신은 또한 필드가됩니다 ..then

svcutil.exe /wrapped http:///myservice?wsdl 

:

난 당신이 포장 옵션 /로 생성하는 경우 때문에 누락 된 필드, (나 4.0.30319.17929에 대한) svcutil.exe에 버그라고 생각합니다 'meetingIdSpecified'가 생성되었습니다!