0

我有一个 .NET Web 服务,我想接受它List<int> fooint[] foo. 我尝试将参数声明为这些类型中的每一种,但是在通过序列化程序运行后它被转换为 ArrayOfInt 。

我有另一个以不同方式实现的 Web 服务(旧的,移动到新结构),因此,它不使用 System.Runtime.Serialization 来生成它的引用。这具有不将 int[] 参数转换为 ArrayOfInt 的有益副作用。

有趣的是,我的 Web 服务的方法很高兴地返回 int[]。它只是不接受 int[] 作为参数:

[WebMethod(Description = "Gets a list of Tasks from a list of Order IDs.")]
public List<TaskDto> GetTasksByIDList(int[] idList)
{
    return new List<TaskDto>();
}

[Test]
public void GetTasksByIDList()
{
    Task taskDto = WorkflowServices.CreateInstallTask(OrderID, TaskTemplateID, SiteID, DataCenterID,
                                                         DeviceTemplateID, DeviceName, Username);

    Task secondTaskDto = WorkflowServices.CreateInstallTask(OrderID, TaskTemplateID, SiteID, DataCenterID,
                                             DeviceTemplateID, DeviceName, Username);

    ArrayOfInt idList = new ArrayOfInt{ taskDto.ID, secondTaskDto.ID };

    List<Task> tasks = WorkflowServices.GetTasksByIDList(idList).ToList();

    if (tasks.Count() != idList.Count())
        throw new Exception(string.Format("Failed to find {0} tasks by ID. Received: {1}", idList.Count(), tasks.Count()));
}

关于如何说服我的服务接受 int[] 而不是 ArrayOfInt 的任何想法?我不希望最终用户必须了解 ArrayOfInt 集合对于某些场景而不是其他场景是什么/为什么是必需的。

更新:

这是有关此问题的更多信息。首先,我认为正确生成的 Web 服务的屏幕截图。请注意,WSDL 声明指示 ArrayOfInt,但它仍被解释为 int[]:

在此处输入图像描述 现在,相比之下:

在此处输入图像描述

这是他们每个 Reference.cs 文件的顶部。请注意,“好”服务引用是使用 ServiceModel 生成的,但“坏”服务引用不会。

namespace CableSolve.Web.Api.Tests.ComponentServicesProxy {
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cormant.com/cswebapi", ConfigurationName="ComponentServicesProxy.ComponentServicesSoap")]
public interface ComponentServicesSoap {

namespace CableSolve.Web.Api.Tests.WorkflowServicesProxy {
    using System.Runtime.Serialization;
    using System;
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="Order", Namespace="http://www.cormant.com/cswebapi")]
    [System.SerializableAttribute()]
4

2 回答 2

0

我不确定您是否可以像这样直接传递一个数组并让代码识别它。我已经能够传递一个包含数组的自定义对象而没有问题

于 2012-09-18T19:03:44.727 回答
0

解决方案是确保我的 WebService 中至少有一个复杂类型派生自一个类,或者是一个抽象类。没有抽象类会导致序列化程序选择 System.Runtime.Serialization 作为选择的序列化引擎,但是通过包含抽象类,它被迫使用 System.ServiceModel。

于 2012-09-19T00:02:45.730 回答