【问题标题】:Why is my WCF service ignoring items in an array parameter?为什么我的 WCF 服务会忽略数组参数中的项目?
【发布时间】:2015-08-06 09:22:12
【问题描述】:

几天前我的 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 消息,这证明了当服务接收到消息时数据存在(客户端没有填充 HasAccessName 参数 - 他们没有丢失):

<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 参数已正确传递。

到底发生了什么?

【问题讨论】:

  • 您的课程没有使用 [DataContract] 属性。
  • @AslamJiffry,因为我已经在您的答案被删除之前评论了它 - DataContract is not necessary。这不是问题。
  • 我故意删了。它不适合作为答案。它应该在评论中。谢谢。
  • 您发布的消息是否被 wcf 跟踪日志捕获?只是关于 DataContract 的评论:您发布的链接包含大量信息,但我更喜欢获取有关自己的 Microsoft 帖子的信息,并且 (msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx) 说:“原始类型 .... 被视为具有默认值数据合同。” “您创建的新复杂类型必须定义为可序列化的数据协定”,例如您的 PremiumContent 类。无论如何,这不是重点,我已经按原样测试了您的代码并在这里工作。
  • @RicardoPontual 感谢您的链接。是的,该消息是使用WCF Message Logging 捕获的

标签: c# .net wcf c#-4.0 soap


【解决方案1】:

嗯,从我的代码示例中看不到,但事实证明我的同事几个月前更改了 PremiumContent 类的命名空间。我想有某种缓存正在进行,因为该更改于上个月发布,但仅在三天前进行修补程序时才开始引起问题。更新服务引用解决了这个问题。

我不确定这个问题是否足够有帮助,值得保留,因为它是如此具体 - 但我会留下它,以防它确实提示有人检查这些东西。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2010-11-03
    相关资源
    最近更新 更多