C# 为什么我的WCF服务会忽略数组参数中的项?
几天前,我的WCF服务突然停止正常工作,似乎没有触及客户端或服务器。具体来说,这是一个无法正常工作的单一操作,因为其中一个参数是数组,该数组从不由WCF填充 我在生产环境和我自己的开发环境中都观察到了这一点。当我调试传出客户机方法时,数组只有一个项,但传入服务方法接收到一个空数组 该服务的界面如下所示:C# 为什么我的WCF服务会忽略数组参数中的项?,c#,.net,wcf,c#-4.0,soap,C#,.net,Wcf,C# 4.0,Soap,几天前,我的WCF服务突然停止正常工作,似乎没有触及客户端或服务器。具体来说,这是一个无法正常工作的单一操作,因为其中一个参数是数组,该数组从不由WCF填充 我在生产环境和我自己的开发环境中都观察到了这一点。当我调试传出客户机方法时,数组只有一个项,但传入服务方法接收到一个空数组 该服务的界面如下所示: [ServiceContract] public interface IMembershipService { [OperationContract] Boolean Activ
[ServiceContract]
public interface IMembershipService
{
[OperationContract]
Boolean ActivateAllPremiumContent(Int32 memberId, PremiumContent[] premiumContentIds);
}
public class PremiumContent
{
public Int32 Id { get; set; }
public String Name { get; set; }
public DateTime? Expiry { get; set; }
public Boolean HasAccess { get; set; }
}
我已经记录了传入的SOAP消息,这证明了当服务接收到消息时数据是存在的(客户端没有填充HasAccess
和Name
参数-它们没有丢失):
邮递
500
text/xml;字符集=utf-8
gzip,放气
100继续
local.redact.com
"http://tempuri.org/IMembershipService/ActivateAllPremiumContent"
http://local.redacted.com/webservices/membership/membershipservice.svc
http://tempuri.org/IMembershipService/ActivateAllPremiumContent
112415
2015-09-06T09:38:15.54
假的
4.
在接收此SOAP消息和WCF将其转换为函数调用之间的某个地方,premiumContentId
数组会丢失其内容。但是,memberId
参数的传递是正确的
到底发生了什么?好吧,从我的代码示例中不可能看到,但事实证明我的同事几个月前更改了
PremiumContent
类的名称空间。我猜是因为上个月发布了更改,所以出现了某种缓存,但三天前热修复程序发布时才开始出现问题。更新服务引用修复了该问题
我不确定这个问题是否有足够的帮助来保证保留,因为它太具体了——但我将把它留着,以防它确实会促使某人检查这些东西。好吧,从我的代码示例中不可能看到,但事实证明我的同事几个月前更改了
PremiumContent
类的名称空间。我猜是因为上个月发布了更改,所以出现了某种缓存,但三天前热修复程序发布时才开始出现问题。更新服务引用修复了该问题
我不确定这个问题是否有足够的帮助值得保留,因为它太具体了-但我将保留它,以防它确实会提示某人检查这些东西。您的类没有使用[DataContract]属性。@AslamJiffry,因为在删除之前我已经对您的答案进行了评论-。这不是问题所在。我故意删除了它。这不是一个合适的答案。它应该在评论中。谢谢。你发布的消息是用wcf跟踪日志捕获的吗?只是对DataContract的一点评论:您发布的链接提供了大量信息,但我更喜欢从自己的Microsoft帖子中获取信息,其中()写道:“基本类型……被视为具有默认数据约定。”“您创建的新复杂类型必须定义数据约定才能序列化”就像你的预备班。无论如何,这不是重点,我已经测试了您的代码,并在这里工作。@RicardoPontual感谢您的链接。是的,该消息是使用您的类捕获的,但未使用[DataContract]属性。@AslamJiffry,因为在删除之前我已经对您的答案发表了评论-。这不是问题所在。我故意删除了它。这不是一个合适的答案。它应该在评论中。谢谢。你发布的消息是用wcf跟踪日志捕获的吗?只是对DataContract的一点评论:您发布的链接提供了大量信息,但我更喜欢从自己的Microsoft帖子中获取信息,其中()写道:“基本类型……被视为具有默认数据约定。”“您创建的新复杂类型必须定义数据约定才能序列化”就像你的预备班。无论如何,这不是重点,我已经测试了您的代码,并在这里工作。@RicardoPontual感谢您的链接。是的,该消息是使用
<MessageLogTraceRecord>
<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<Content-Length>500</Content-Length>
<Content-Type>text/xml; charset=utf-8</Content-Type>
<Accept-Encoding>gzip, deflate</Accept-Encoding>
<Expect>100-continue</Expect>
<Host>local.redacted.com</Host>
<SOAPAction>"http://tempuri.org/IMembershipService/ActivateAllPremiumContent"</SOAPAction>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://local.redacted.com/webservices/membership/membershipservice.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IMembershipService/ActivateAllPremiumContent</Action>
</s:Header>
<s:Body>
<ActivateAllPremiumContent xmlns="http://tempuri.org/">
<memberId>112415</memberId>
<premiumContentIds xmlns:a="http://schemas.datacontract.org/2004/07/Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:PremiumContent>
<a:Expiry>2015-09-06T09:38:15.54</a:Expiry>
<a:HasAccess>false</a:HasAccess>
<a:Id>4</a:Id>
<a:Name i:nil="true"></a:Name>
</a:PremiumContent>
</premiumContentIds>
</ActivateAllPremiumContent>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>