2010-09-13 27 views
2

我正在使用protobuf-net來處理數據合同中的項目,手動創建.proto文件,並讓自定義工具發出正在執行的C#代碼。 我也開始將它用於服務合約,並且服務接口也創建得很好。從.proto rpc條目生成FaultContract屬性

爲了連接到某些系統,我使用WCF,因此我啓用了datacontracts生成器選項,儘管存在System.ServiceModel屬性,但似乎沒有任何方式可以聲明服務可能引發的特定故障。

所以我的問題基本上是:

  • Protocol Buffers的語言似乎並未有異常/故障的任何結構。
  • 我看不到任何用於生成FaultContract屬性的protobuf-net選項。
  • 由protobuf-net生成的接口未聲明爲部分,因此我無法擴充生成的代碼。

有什麼辦法可以在protobuf-net中聲明服務WCF操作錯誤,或者這是我需要等待版本2的東西嗎?

非常感謝。

回答

2

我不確定爲什麼我不聲明爲partial interface,因爲在C#2.0中看起來很完美;當我得到第二個時,我會得到改變,但請注意,您可以在本地應用手動更改 - 只需編輯csharp.xslt文件即可。現在,XSLT是不宜喝茶的每個人的杯子,但它應該是一個1線變化(靠近字interface) - 事實上,它可能是另外的partial這裏:

<xsl:template match="ServiceDescriptorProto"> 
    <xsl:if test="($optionClientProxy or $optionDataContract)"> 
    [global::System.ServiceModel.ServiceContract(Name = @"<xsl:value-of select="name"/>")]</xsl:if> 
    public /* HERE => */ partial /* <= HERE */ interface I<xsl:value-of select="name"/> 
    { 
     <xsl:apply-templates select="method"/> 
    } 

    <xsl:if test="$optionProtoRpc"> 
    public class <xsl:value-of select="name"/>Client : global::ProtoBuf.ServiceModel.RpcClient 
    { 
     public <xsl:value-of select="name"/>Client() : base(typeof(I<xsl:value-of select="name"/>)) { } 
     <xsl:apply-templates select="method/MethodDescriptorProto" mode="protoRpc"/> 
    } 
    </xsl:if> 
    <xsl:apply-templates select="." mode="clientProxy"/> 

</xsl:template> 

由於該xslt是可調整的,您應該能夠應用您需要的任何其他更改。

+0

啊,非常感謝馬克。不知道有這些可訪問的模板。這應該做的伎倆。 – 2010-09-14 13:41:58

0

這並不直接回答你的問題,但可適當反正
protobuf網並不需要.proto文件的工作,所以這將是的精力去寫你的C#類和裝飾他們同樣的量與WCF屬性(和您的FaultContract屬性)相比,爲了生成C#類創建原型(手動)。

+0

謝謝@wal,但我需要從棒的.proto末尾來解決問題,因爲我需要控制消息(類型)的佈局,以便與組織中的其他應用程序保持一致。 – 2010-09-13 15:06:07

+0

保羅,我可以建議的唯一的其他事情是也許自己實現這些變化。我最近做了這個(v1),看到http://stackoverflow.com/questions/3523225/protobuf-net-and-interface-support「>這很有趣,這取決於你當然的樂趣的定義。:) – wal 2010-09-14 01:55:14

+0

嗯,因爲退後一步,我認爲我將不得不放棄WCF錯誤並在響應消息中包含錯誤信息,以保持跨RPC服務器的API一致性,因爲協議緩衝區不支持異常的概念/故障。謝謝你的建議,雖然。 – 2010-09-14 08:22:44