2012-03-13 82 views
2

我想爲wcf服務創建一個單向方法。一切都很好,除非 我想返回錯誤信息 - 如果有的話。帶故障消息的WCF服務單向方法

我爲wsdl和合同文件使用wscf藍色代碼生成器。

在WSDL操作元素,我只有「輸入」和「故障」的子元素。 當我運行服務時,我得到了無法在單向通信中聲明錯誤消息的信息,並且..解決方案之一是將單向設置爲false ..我做了什麼以及它的工作正常。如果發生錯誤,我收到消息。

但是我想知道如果我打破了Web服務/ wsdl創建規則......因爲從wsdl服務模式生成器爲我創建了單向通信(設置爲'true')以及其他編程語言中的其他生成器大概是這樣做的...

那麼它是正確的我做了什麼?如何更改wsdl以便生成器可以適當地創建代碼?

如果在理論上,我不能在單向通信使用故障,然後我需要在應對額外的結構返回任何錯誤?

謝謝!

回答

4

這是真的,one-way operations can't return faults給客戶。如果你想生成一個WCF void不是單向服務操作,則必須要添加一個空的輸出元素在您的WSDL合同中操作。

基於.NET WSDL解析器(如WSCF.bluesvcutil)將生成單向服務操作爲<wsdl:operation>元素都有相應<wsdl:output>元件。

例如,這WSDL操作is one-way

<wsdl:definitions> 
    <wsdl:portType> 
     ... 
     <wsdl:operation name="Foo"> 
      <wsdl:input message="tns:FooRequest" /> 
     </wsdl:operation> 
    </wsdl:portType> 
</wsdl:definitions> 

在另一方面,限定一個空<wsdl:output>元件的操作(即,包含一個空序列的XSD型)將被映射到一個void不是單向的方法。NET,其可任選地包含一個故障聲明:

<wsdl:definitions> 
    <wsdl:portType> 
     ... 
     <wsdl:operation name="Foo"> 
      <wsdl:input message="tns:FooRequest" /> 
      <wsdl:output message="tns:FooResponse" /> 
      <wsdl:fault message="tns:FooFault" /> 
     </wsdl:operation> 
    </wsdl:portType> 
</wsdl:definitions> 

其中<tns:FooResponse>型被簡單地定義爲:

<xs:element name="FooResponse"> 
    <xs:complexType> 
     <xs:sequence/> 
    </xs:complexType> 
</xs:element> 
+0

但問題是,如果我定義(XSD中)空響應元素和生成wsdl,c#契約文件等,那麼它不會創建void方法,而是使用響應名稱創建類。我只是不知道如何強制wscf藍色生成無效的單向服務操作,以便我可以使用錯誤消息..你知道嗎? – user740144 2012-03-13 09:24:47

+0

非常感謝,按預期工作! – user740144 2012-03-13 09:39:14

+0

看看[這個WSDL合約](http://codepaste.net/odijzx)。這是由WCF通過代碼中定義的'Foo'操作被定義爲'void Foo(FooRequest請求)'''裝飾有'[OperationContract(OneWay = false)]''''生成的。 「FooResponse」類型被定義爲具有空序列的複雜類型。 – 2012-03-13 09:44:31

1

在WCF,單向意味着操作沒有返回值,並在客戶端不關心調用的成功或失敗。

在WCF中,我們也得到了其自然單向的,比如你通過WCF操作MSMQ,那麼操作通常設置爲單向一些其他的操作。

所以,如果你想要回東西,表示調用狀態,然後單向是不是一個正確的選擇,你可以使用正常的WCF操作這不是代替單向的。

對於單向操作,這裏是供您參考WCF ONE-WAY

0

的文章,我覺得你做了正確的事情。對於任何類型的客戶端(C#,JAVA,C++,PHP),他們只需要WSDL來創建代理。我覺得它也應該用其他語言。最好使用SoapUI(中性肥皂客戶端)來測試您的服務。