Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WCF中修改wsdl:part的名称和元素属性?_C#_Asp.net_.net_Wcf - Fatal编程技术网

C# 如何在WCF中修改wsdl:part的名称和元素属性?

C# 如何在WCF中修改wsdl:part的名称和元素属性?,c#,asp.net,.net,wcf,C#,Asp.net,.net,Wcf,这看起来很简单,但我确实对wsdl:part的元素和名称属性感到困惑。这是C#中服务代码的一部分: 界面: [ServiceContract(Namespace = "http://example.org/virtualfoo")] public interface IRestFooService { [OperationContract] [WebInvoke(UriTemplate = "getFoo", Method = "

这看起来很简单,但我确实对
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;
    }
}
...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponseTest" name="getFooResponseTest"/>
</wsdl:message>
...
服务:

[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;
    }
}
...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponseTest" name="getFooResponseTest"/>
</wsdl:message>
...
复杂类型:

[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;
    }
}
...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponseTest" name="getFooResponseTest"/>
</wsdl:message>
...
getFooResponse
类是另一种复杂类型(自定义类)

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

我有这个:

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

[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;
    }
}
...
<wsdl:message name="getFooResponseMess">
    <wsdl:part element="tns:getFooResponseTest" name="getFooResponseTest"/>
</wsdl:message>
...
。。。
...
但有可能有不同的价值观吗?我怎么做?我想知道我的错误是什么,为什么会这样


我已经寻找了其他问题,但这个问题的解决方案在我的案例中不起作用:

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

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

  • 如果消息约定未包装,即如果属性IsWrapped设置为false,则消息约定只能有一个主体部分

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

  • 响应消息协定的包装器元素的名称必须与后缀为“response”的操作的名称相同。为此使用消息协定的WrapperName属性


  • 我很感激您的回答,它很有帮助,但是,当使用
    WrapperName
    IsWrapped=true
    时,
    wsdl:part
    的“name”属性变成了“parameters”,而“element”属性变成了我想要的属性,我如何更改“parameters”的值?,从您的回答中我了解到,不建议使用
    System.ServiceModel
    注释,然后是否应使用
    System.Xml.Serialization
    ?根据Microsoft文档,ElementName将与name具有相同的值。如果两个属性的值相互冲突,则ElementName将覆盖name。有关它的更多信息,您可以参考以下链接: