【问题标题】:How can I control the name of a generic WCF Message Contract如何控制通用 WCF 消息合同的名称
【发布时间】:2010-10-18 17:26:58
【问题描述】:

我正在使用消息契约模型生成 WCF 服务。

我已经创建了一个通用的请求消息合约,如下所示:

[MessageContract]
public Request<T>
{
    [MessageBodyMember]
    public T Details { get; set; }
}

我习惯于使用[DataContract(Name="Contract{0}")] 为通用数据合约生成可读的名称,但这种方法似乎不适用于使用消息合约的我。

有没有办法使用消息契约模型实现相同的行为?

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    你想要完成的工作似乎很多,但我相信你可以创建一个 MessageInspector,它允许你直接与 XML 交互。

    客户端消息检查器实现IClientMessageInspector 接口,服务消息检查器实现IDispatchMessageInspector 接口。

    http://msdn.microsoft.com/en-us/library/aa717047.aspx

    任何服务(调度程序)消息检查器都必须实现两个IDispatchMessageInspector 方法AfterReceiveRequestBeforeSendReply

    链接更详细,但是一旦你实现了这些,你应该能够将检查器添加到你的 web.config 中,你应该已经准备好了。

    【讨论】:

    • 我想你可能误解了这个问题。鉴于有一个通用的 MessageContract 例如Request&lt;T&gt;,如何在 WSDL 中为 Request&lt;T&gt; 的封闭泛型类型的输入生成一个 clean 名称,例如Request&lt;ServiceInput&gt;。 OP 想在 WSDL 中为前一个泛型类型生成一个名称,例如 RequestOfServiceInput,但似乎为 MessageContracts 命名泛型类型与此处描述的 DataContracts 不同:msdn.microsoft.com/en-us/library/ms731045.aspx#sectionSection4
    • 你可能是正确的@RussCam。在这种情况下,他需要使用IWsdlExportExtension 来定制/扩展 WSDL。你可以在这里找到一个例子:blogs.msdn.com/b/skaufman/archive/2009/05/29/…
    【解决方案2】:

    MessageContract 属性上有一个 WrapperNameWrapperNamespace 属性,我认为它们的作用相同。例如,

    [MessageContract(WrapperName = "FooMessage", IsWrapped = true)]
    public class Request<T>
    { ... }
    

    注意添加了IsWrapped 属性以指示消息应序列化到包装器元素中。

    【讨论】:

    • 我尝试使用 WrapperName = "WrapperFor{0}",但这在 WSDL 中解析为一个非常讨厌的名称(Unicode 等效于 {0})并且没有执行我预期的翻译.
    • 此外,当T 也恰好是泛型类型并且DataContract Name 属性使用占位符时,这似乎会引发异常,例如GenericOf{0}。我很想知道 Generic MessageContracts 和 DataContracts 是否可以与被覆盖的通用名称一起使用,所以我对这个问题给予了赏金
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多