C# WCF从XML接收空模型
我们有一个定义了类的WCF服务(类是使用XML自动生成的): IService.cs的定义如下: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
[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绑定可能会忽略
,但为了安全起见,请删除它。SOAP绑定是多余的,因为SOAP总是POST的WebInvokeAttribute
信封
和正文
类型,但是如果它们没有被引用,它们将不会做任何事情,这正是您想要的。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; }