C# WCF:数组参数

C# WCF:数组参数,c#,arrays,wcf,soap,C#,Arrays,Wcf,Soap,我想定义一个C#WCF服务,它公开由给定格式的消息调用的操作。下面给出了该消息的一个示例。该格式由我无法控制的客户端定义。我只控制服务端 总之,我有一个WCF操作,它应该将数组作为它的唯一参数。数组参数的表示方式如下面的示例消息所示。然而,该参数目前没有被正确地反序列化,并且最终在服务端为空,尽管它在来自客户端的SOAP消息中显示正确。如何更改WCF服务以正确反序列化参数 (我知道有一大堆问题看起来非常相似,而且很长的MSDN文章都是关于如何以各种格式对集合和数组进行反序列化的,但由于某些原因,

我想定义一个C#WCF服务,它公开由给定格式的消息调用的操作。下面给出了该消息的一个示例。该格式由我无法控制的客户端定义。我只控制服务端

总之,我有一个WCF操作,它应该将数组作为它的唯一参数。数组参数的表示方式如下面的示例消息所示。然而,该参数目前没有被正确地反序列化,并且最终在服务端为空,尽管它在来自客户端的SOAP消息中显示正确。如何更改WCF服务以正确反序列化参数

(我知道有一大堆问题看起来非常相似,而且很长的MSDN文章都是关于如何以各种格式对集合和数组进行反序列化的,但由于某些原因,我一直遇到问题,或者我根本无法回答足够相似的问题并将其应用到我的场景中)

以下是我已经尝试过的许多方法中的一些:

  • 改变
    操作格式样式
    操作格式使用
    操作合同
    上的属性
  • 字符串[]
    使用和不使用
    ServiceKnownType
    属性
  • 使用集合而不是数组
  • 使用.NET framework源代码单步调试到WCF程序集
  • 阅读SOAP第5节和第7节编码
  • 调整数据协定成员的命名空间参数
  • 更改数据协定中数组元素的名称(
    ItemNameAttribute
我认为与原始代码相比,我已经更接近于能够工作的东西了。以前,使用
OperationFormatStyle.Rpc
OperationFormatUse.Encoded
,我只是收到一个
FaultException
声明请求未能反序列化

对于下面的代码,至少我不再有任何异常,但服务端的反序列化数组是空的

下面是我正在接收的消息的一个示例,它应该用一个字符串数组类型的参数调用一个操作:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:iControl" xmlns:types="urn:iControl/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://127.0.0.1/iControl/iControlPortal.cgi</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:iControl:GlobalLB/DataCenter</Action>
  </s:Header>
  <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <q1:get_object_status xmlns:q1="urn:iControl:GlobalLB/DataCenter">
      <data_centers href="#id1" />
    </q1:get_object_status>
    <soapenc:Array id="id1" soapenc:arrayType="xsd:string[3]">
      <Item>Datacenter 5d4afe7f-f4e0-4660-9ff1-9c1f8a15a1df</Item>
      <Item>Datacenter 70d88638-4622-46f1-8978-773898f57b0f</Item>
      <Item>Datacenter c8fc4b53-af74-4f71-b7a7-9102fbd684b6</Item>
    </soapenc:Array>
  </soap:Body>
</soap:Envelope>
下面是请求数据契约的样子。如上所述,传递原语参数(如普通字符串)而不是字符串数组(即将
数据中心的类型从
string[]
更改为
string
)按预期工作

[DebuggerStepThrough()]
[GeneratedCode("System.ServiceModel", "4.0.0.0")]
[EditorBrowsable(EditorBrowsableState.Advanced)]
[MessageContract(WrapperName = "get_object_status", WrapperNamespace = "urn:iControl:GlobalLB/DataCenter",
    IsWrapped = true)]
[KnownType(typeof(string[]))]
public partial class get_object_statusRequest
{
    [MessageBodyMember(Namespace = "", Order = 0)]
    public string[] data_centers;

    public get_object_statusRequest()
    {
    }

    public get_object_statusRequest(string[] data_centers)
    {
        Console.WriteLine("XXX: " + String.Join(" ", data_centers));
        this.data_centers = data_centers;
    }
}
以下是操作实现:

public get_object_statusResponse get_object_status(get_object_statusRequest request)
{
    Console.WriteLine("Arguments: " + request.data_centers);
    Console.WriteLine("Datacenters:");
    foreach (var d in request.data_centers)
    {
        Console.WriteLine(d);
    }

    return new get_object_statusResponse();
}
输出如下,即没有任何数组元素进入该方法。我希望示例消息中的字符串包含在传递的数组中

Arguments: System.String[]
Datacenters:

你能用1-2句话陈述你手头的问题吗?我有点想知道你想要达到什么目标,但我无法理解你的实际问题(也许你忘记了一个不在中间的部分)。谢谢!一开始我试图简单地重申问题的要点。我希望现在好多了。你能用1-2句话陈述你手头的问题吗?我有点想知道你想要达到什么目标,但我无法理解你的实际问题(也许你忘记了一个不在中间的部分)。谢谢!一开始我试图简单地重申问题的要点。我希望现在好多了。
Arguments: System.String[]
Datacenters: