【问题标题】:How to modify name and element attributes of wsdl: part in WCF?如何修改wsdl的名称和元素属性:WCF的一部分?
【发布时间】:2021-02-16 08:11:44
【问题描述】:

看起来很简单,但我对wsdl:part的元素和名称属性确实感到困惑。这是 C# 中服务代码的一部分:

界面:

[ServiceContract(Namespace = "http://example.org/virtualfoo")]
public interface IRestFooService
{
    [OperationContract]
    [WebInvoke(UriTemplate = "getFoo", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    getFooResponseMess getFoo(getFooRequest request);
}

服务:

[ServiceBehavior(Namespace = "http://example.org/virtualfoo")]
public class RestFooService: IRestFooService
{
    public getFooResponseMess getFoo(getFooRequest request)
    {
        // code
    }
}

复杂类型:

[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
public partial class getFooResponseMess
{

    [System.ServiceModel.MessageBodyMember(Namespace = "http://example.org/virtualfoo")]
    public getFooResponse getFooResponse;

    public getFooResponseMess()
    {
    }

    public getFooResponseMess(getFooResponse getFooRes)
    {
        this.getFooResponse = getFooRes;
    }
}

getFooResponse 类是另一种复杂类型(自定义类)

我有一个 WCF,但是当我看到 wsdl 结构时,我想区分或自定义这部分:

我有这个:

...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponse" name="getFooResponse"/>
</wsdl:message>
...

但我想要这个:

...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponse" name="getFooResult"/>
</wsdl:message>
...

显然,如果我更改复杂类型 (getFooResponseMess) 的类的属性名称,它会同时更改 nameelement 属性:

[System.ServiceModel.MessageBodyMember(Namespace = "http://example.org/virtualfoo")]
public getFooResponse getFooResponseTest; // Change

Wsdl 输出:

...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponseTest" name="getFooResponseTest"/>
</wsdl:message>
...

但是可以有不同的值吗?我该怎么做?我想知道我的错误是什么以及为什么会发生这种情况

我一直在寻找其他问题,但这个问题的解决方案在我的情况下不起作用:Changing wsdl:part name

【问题讨论】:

    标签: c# asp.net .net wcf


    【解决方案1】:

    WCF 允许您使用 XML 的传统 SOAP 编码样式,但是不建议使用它。使用此样式时(通过在应用于服务协定的 System.ServiceModel.XmlSerializerFormatAttribute 上将 Use 属性设置为 Encoded),需要注意以下额外注意事项:

    1. 不支持消息头;这意味着属性 MessageHeaderAttribute 和数组属性 MessageHeaderArrayAttribute 与 SOAP 编码不兼容。

    2. 如果消息合约没有被包装,即如果属性 IsWrapped 设置为 false,则消息合约只能有一个正文部分。

    3. 请求消息契约的包装元素的名称必须与操作名称匹配。为此,请使用消息协定的 WrapperName 属性。

    4. 响应消息合约的包装元素名称必须与后缀为“Response”的操作名称相同。为此,请使用消息协定的 WrapperName 属性。

    【讨论】:

    • 感谢您的回答,这很有帮助,但是,当使用 WrapperNameIsWrapped = true 时,wsdl:part 的“名称”属性变为“参数”,“元素”属性变为我想要的那个,我怎样才能改变“参数”的值?从你的回答中我了解到,不推荐使用System.ServiceModel注释,我应该使用System.Xml.Serialization吗?
    • 根据 Microsoft 文档,ElementName 将与 name 具有相同的值。如果两个属性的值相互冲突,则 ElementName 将覆盖 name。更多相关信息可以参考这个链接:docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/…
    猜你喜欢
    • 2011-03-19
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多