0

List<int> fooまたはのいずれかを受け入れたい.NETWebサービスがありますint[] 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()));
}

ArrayOfIntの代わりにint[]を受け入れるようにサービスを説得する方法について何かアイデアはありますか?エンドユーザーが、ArrayOfIntコレクションが一部のシナリオでのみ必要であり、他のシナリオでは必要ない理由を理解する必要はありません。

アップデート:

この問題に関する詳細情報は次のとおりです。まず、適切に生成されたと思われるWebサービスのスクリーンショット。WSDL宣言はArrayOfIntを示していますが、それでもint[]として解釈されることに注意してください。

ここに画像の説明を入力してください 対照的に、今:

ここに画像の説明を入力してください

そして、これがそれぞれのReference.csファイルの先頭です。'good'サービス参照はServiceModelを使用して生成されますが、'bad'サービス参照は生成されないことに注意してください。

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 内の少なくとも 1 つの複合型がクラスから派生したか、抽象クラスであることを確認することでした。抽象クラスがない場合、シリアライザーは System.Runtime.Serialization を選択するシリアライゼーション エンジンとして選択しますが、抽象クラスを含めることにより、System.ServiceModel を使用する必要があります。

于 2012-09-19T00:02:45.730 に答える