为什么我的 WCF 服务忽略数组参数中的项目?
Why is my WCF service ignoring items in an array parameter?
几天前,我的 WCF 服务突然停止正常工作,似乎没有触及客户端或服务器。具体来说,这是一个无法正常工作的单一操作,因为其中一个参数是一个数组,它永远不会被 WCF 填充。
我在生产环境和我自己的开发环境中都观察到了这一点。当我调试传出客户端方法时,数组只有一个项目,但传入服务方法收到一个空数组。
该服务的界面如下所示:
[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
参数未由客户 - 他们没有迷路):
<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>
在收到此 SOAP 消息与 WCF 将其转换为函数调用之间的某处,premiumContentIds
数组丢失了其内容。不过 memberId
参数已正确传递。
这到底是怎么回事?
嗯,从我的代码示例中看不出来,但事实证明我的同事几个月前更改了 PremiumContent
class 的命名空间。我猜有某种缓存正在进行,因为该更改是上个月发布的,但只是在三天前进行修补程序时才开始引起问题。更新服务参考解决了问题。
我不确定这个问题是否有足够的帮助值得保留,因为它是如此具体 - 但我会保留它以防它确实提示有人检查这些东西。
几天前,我的 WCF 服务突然停止正常工作,似乎没有触及客户端或服务器。具体来说,这是一个无法正常工作的单一操作,因为其中一个参数是一个数组,它永远不会被 WCF 填充。
我在生产环境和我自己的开发环境中都观察到了这一点。当我调试传出客户端方法时,数组只有一个项目,但传入服务方法收到一个空数组。
该服务的界面如下所示:
[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
参数未由客户 - 他们没有迷路):
<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>
在收到此 SOAP 消息与 WCF 将其转换为函数调用之间的某处,premiumContentIds
数组丢失了其内容。不过 memberId
参数已正确传递。
这到底是怎么回事?
嗯,从我的代码示例中看不出来,但事实证明我的同事几个月前更改了 PremiumContent
class 的命名空间。我猜有某种缓存正在进行,因为该更改是上个月发布的,但只是在三天前进行修补程序时才开始引起问题。更新服务参考解决了问题。
我不确定这个问题是否有足够的帮助值得保留,因为它是如此具体 - 但我会保留它以防它确实提示有人检查这些东西。