Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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从XML接收空模型_C#_Xml_Web Services_Wcf_Xml Deserialization - Fatal编程技术网

C# WCF从XML接收空模型

C# WCF从XML接收空模型,c#,xml,web-services,wcf,xml-deserialization,C#,Xml,Web Services,Wcf,Xml Deserialization,我们有一个定义了类的WCF服务(类是使用XML自动生成的): IService.cs的定义如下: [OperationContract] [WebInvoke(Method = "POST", UriTemplate = "Test", RequestFormat = WebMessageFormat.Xml)] //[XmlSerializerFormat] string Test(Envelope parameter); 和执行: p

我们有一个定义了类的WCF服务(类是使用XML自动生成的):

IService.cs的定义如下:

    [OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "Test",
    RequestFormat = WebMessageFormat.Xml)]
    //[XmlSerializerFormat]
    string Test(Envelope parameter);
和执行:

    public string Test(Envelope parameter)
    {
        return "";
    }
但测试函数中的“参数”包含空对象。我知道XML反序列化存在问题,但无法确定具体位置

编辑:这是我通过邮递员发送的请求

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<notifications xmlns="http://soap.sforce.com/2005/09/outbound">
<OrganizationId>123456</OrganizationId>
<ActionId>123456</ActionId>
<SessionId>123456</SessionId>
<EnterpriseUrl>https://eu8.salesforce.com/</EnterpriseUrl>
<PartnerUrl>https://eu8.salesforce.com/</PartnerUrl>
<Notification>
<Id>123456</Id>
<sObject xsi:type="sf:Asset" xmlns:sf="urn:sobject.enterprise.soap.sforce.com">
 <sf:Id>123456</sf:Id>
 <sf:Asset_Account_City__c>123456</sf:Asset_Account_City__c>
 <sf:Asset_Account_Country__c>123456</sf:Asset_Account_Country__c>
 <sf:Asset_Account_Name__c>123456</sf:Asset_Account_Name__c>
 <sf:Asset_Customer_ID__c>123456</sf:Asset_Customer_ID__c>
 <sf:Expiration_Date__c>123456</sf:Expiration_Date__c>
 <sf:License__c>123456</sf:License__c>
 <sf:Reader_Code__c>123456</sf:Reader_Code__c>
 <sf:Reader_Quantity__c>123456</sf:Reader_Quantity__c>
</sObject>
</Notification>
</notifications>
</soapenv:Body>
</soapenv:Envelope>

123456
123456
123456
https://eu8.salesforce.com/
https://eu8.salesforce.com/
123456
123456
123456
123456
123456
123456
123456
123456
123456
123456

基于SOAP的绑定为您解包SOAP信封,因此您不需要定义SOAP信封类型。您所使用的WebHttpBinding对SOAP一无所知,它希望契约类型(您的服务方法
IService.Test
的参数)与整个HTTP正文相匹配,因此我看到了您所做操作的逻辑,但是我认为没有必要像这样对框架进行操作

要修复此场景,请执行以下几项操作:

  • 修改IService.Test的实现,以获取类型为
    Notifications
    • 字符串测试(通知)
  • 修改服务配置以指定基于HTTP的SOAP绑定,可能是BasicHttpBinding
  • 我认为SOAP绑定可能会忽略
    WebInvokeAttribute
    ,但为了安全起见,请删除它。SOAP绑定是多余的,因为SOAP总是POST的
我认为您不需要删除
信封
正文
类型,但是如果它们没有被引用,它们将不会做任何事情,这正是您想要的。WCF绑定以本机方式理解SOAP信封,不需要指定它,需要提供类型的是SOAP主体元素的内容

您的XML示例在
通知
下包含一个
通知
的实例,但名称意味着此子元素可能在重复-如果是,我认为生成的类不适合您,因为
通知
类有一个单一的
通知
属性-您链接到的生成器无法知道这一点,因此我不会以任何方式对其进行指责。我添加了一个
通知
元素的副本作为兄弟元素,并再次运行它-这次它生成了一个列表成员:

[XmlElement(ElementName="Notification", Namespace="http://soap.sforce.com/2005/09/outbound")]
public List<Notification> Notification { get; set; }
[xmlement(ElementName=“通知”,命名空间=”http://soap.sforce.com/2005/09/outbound")]
公共列表通知{get;set;}

您可以使用VisualStudio(我想)提供的
xsd.exe
工具生成类-请参阅。如果web工具在幕后推动这一点,我不会感到惊讶,但我相信
xsd.exe
会生成尽可能符合WCF期望的类。

为什么定义SOAP信封格式?WCF通常为您打开SOAP信封。你不应该这样做。请您具体说明您使用的是什么绑定;我怀疑这只在任何地方接近正常工作,因为您使用的是WebHttpBinding,它不是为处理SOAP而设计的—受
WebInvoke
属性的支持。如果您使用“普通”WCF,这就可以了。该类是使用XML示例请求中提供的链接自动生成的。是的,我使用WebHttpBinding是因为项目中还有其他东西。好吧,不要这样做。为此端点使用正确的绑定(可能是BasicHttpBinding),并让您的操作契约接受
通知,而不是
信封。您不需要为信封定义模式,WCF不是设计为这样工作的。我应该如何处理模型中的所有名称空间?若我没弄错的话,我只需要从课堂上删除信封和正文。你能修改代码并把它作为一个答案吗?非常感谢你的时间。我将尝试所有建议的解决方案并向您汇报。还有一个问题。我应该在课堂上留下哪些注解?[XmlElement]、[DataMember]、[Serializable]?您可能会遇到问题<代码>通知
仅包含一个单数的
通知
属性,而该名称暗示该元素可能正在重复。将在回答中详细说明。
[XmlElement(ElementName="Notification", Namespace="http://soap.sforce.com/2005/09/outbound")]
public List<Notification> Notification { get; set; }