1

WCF 経由でオブジェクトを渡そうとしています。などは問題なく通過できますがstrings、このオブジェクトのリストは機能しません。ints

ここに私の2つの特定のエラーがあります:

エラー 1:

The best overloaded method match for
 'test.ServiceReference1.JobsClient.FilesToControl(test.ServiceReference1.Item[])'
 has some invalid arguments

エラー 2:

Argument 1: cannot convert from 'System.Collections.Generic.List<test.Site1.Item>'
 to 'test.ServiceReference1.Item[]'

これは、asp.net 内で呼び出そうとする関数です。

// Commit the files
ServiceReference1.JobsClient Client = new ServiceReference1.JobsClient();
Client.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://" +   DropDownListSystems.SelectedValue + ":8732/FactoryAudit/");
test.ServiceReference1.ReturnClass ControlFiles_Result;
ControlFiles_Result = Client.FilesToControl(lstNewItems);

lstNewItems(渡そうとするオブジェクト) は、次のコードとして定義されます。

List<Item> lstNewItems = new List<Item>(); // Control Items  

Itemと定義されている:

public class Item
{
    public Item(string Paramater, string Type)
    {
        _Paramater = Paramater;
        _Type = Type;

    }

    private string _Paramater;

    public string Paramater
    {
        get { return _Paramater; }
        set { _Paramater = value; }
    }

    private string _Type;

    public string Type
    {
        get { return _Type; }
        set { _Type = value; }
    }
}

現在、WCF サービスには、アイテムのリストを受け入れる次の関数があります。

//Files Manager
public  ReturnClass FilesToControl(List<Item> ItemsToControl)

{ return new ReturnClass(1, String.Empty, String.Empty, null, null, null); }

サービス契約は次のように定義されます。

[ServiceContract]
public interface IJobs
{
     //Files Manager
     [OperationContract]
     ReturnClass FilesToControl(List<Item> ItemsToControl);      
}

items クラスは、WCF で次のように定義されています。

[DataContract]
[KnownType(typeof(List<Item>))]
[KnownType(typeof(Item))] 
public class Item
{
   public Item(string Paramater, string Type)
   {
       _Paramater = Paramater;
       _Type = Type;

   }
   [DataMember]
   private string _Paramater;
   [DataMember]
   public string Paramater
   {
       get { return _Paramater; }
       set { _Paramater = value; }
   }
   [DataMember]
   private string _Type;
   [DataMember]
   public string Type
   {
       get { return _Type; }
       set { _Type = value; }
   }
}
4

2 に答える 2

2

アベルのおかげで、私はそれを理解することができました。以下は解決策です。これが他の誰かに役立つことを願っています。

また、asp.net のサービス参照を右クリックし、[サービス参照の構成] をクリックして、[コレクション タイプ] を Systems.Collections.Generic.List に設定する必要があることに注意してください。

これがasp.netで関数を呼び出す方法です

Item NewItem = new Item();
        foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
        {
            NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower();
            NewItem.Type = (String)Session["BrowseType"];
            lstNewItems.Add(NewItem);
        }
       ControlFiles_Result = Client.FilesToControl(lstNewItems);

lstItems の定義は、asp.net では次のとおりです。

  List<Item> lstNewItems = new List<Item>(); // Control Items  

アベルは、ASP プロジェクトの先頭に参照を追加する必要があると言って正しかったです。また、アイテムは WCF アプリケーションで宣言されているため、次の行で参照しているため、asp.net で宣言する必要はありません。

using test.ServiceReference1;

IJobs.cs のコードを WCF に保存します。テストに関しては、プライベートとパブリックに注意してください。これらはすべてパブリックにあり、大混乱を引き起こしました。

using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Collections;
namespace WCFJobsLibrary
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IJobs" in both code and config file together.
    [ServiceContract]
    public interface IJobs
    {
         //Directoy Manager
         [OperationContract]
        ReturnClass FindDrives();
         //Directoy Manager
         [OperationContract]
         ReturnClass FindSubfolders(String Folder_To_Search);
         //Directoy Manager
         [OperationContract]
         ReturnClass FindSubFiles(String Folder_To_Search);
         //Directoy Manager
         [OperationContract]
         ReturnClass FilesToControl(List<Item> ItemsToControl);        

    }


        [DataContract]
      //  [KnownType(typeof(List<Item>))]
        [KnownType(typeof(Item))] 
           public class Item
       {
           public Item(string Paramater, string Type)
           {         
               _Paramater = Paramater;
               _Type = Type;
           }
           private string _Paramater;
            [DataMember]
           public string Paramater
           {
               get { return _Paramater; }
               set { _Paramater = value; }
           }
            private string _Type;
            [DataMember]
           public string Type
           {
               get { return _Type; }
               set { _Type = value; }
           }

       }




}

そして、Jobs.cs - 動作していることを確認するための簡単なテストを行います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Collections;
using System.Web;
using Microsoft.Win32;
namespace WCFJobsLibrary
{

        // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Jobs" in both code and config file together.
       public class Jobs : IJobs
    {


       #region IJobs Members            



        //Files Manager
        public ReturnClass FilesToControl(List<Item> lstNewItems)
       {
           try
           {
               String ThisisAnItemToControl = "";
               String ThisIsItsType = "";

               for (int i = 0; i < lstNewItems.Count; i++) // Loop through List with for
               {
                   ThisisAnItemToControl = lstNewItems[i].Paramater;
                   ThisIsItsType = lstNewItems[i].Type;

               }

               return new ReturnClass(1, ThisisAnItemToControl, String.Empty, null, null, null);

           }

           catch (Exception ex)
           {

               return new ReturnClass(-1, ex.Message.ToString(), ex.InnerException.ToString(), null, null, null);

           }           


       }

        }
       #endregion

最後に、ReturnClass.cs クラスの ReturnClass の定義

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.ComponentModel;
    using System.Data;
    using System.IO;
    using System.Collections;
    using System.Web;
    using Microsoft.Win32;

    namespace WCFJobsLibrary
    {
        public class ReturnClass
        {
            //private members
            private int _errorCode;
            private string _errorMessage;
            private string _exMessage;
            private ArrayList _drives;
            private string[] _folders;
            private string[] _filePaths;


            #region Constructors

            //constructor 1
            public ReturnClass()
            {

            }

            //constructor 2
            public ReturnClass(int iErr, string sErrMsg, string ExMsg, ArrayList arrDrives, string[] sfolders, string[] sFilePaths)
            {
                ErrorCode = iErr;
                ErrorMessage = sErrMsg;
                ExMessage = ExMsg;
                Drives = arrDrives;
                Folders = sfolders;
                FilePaths = sFilePaths;
            }

            #endregion

            #region methods

            //Error Code
            public int ErrorCode
            {
                get { return this._errorCode; }
                set { this._errorCode = value; }
            }

            //error message
            public string ErrorMessage
            {
                get { return this._errorMessage; }
                set { this._errorMessage = value; }
            }

            //exception message
            public string ExMessage
            {
                get { return this._exMessage; }
                set { this._exMessage = value; }
            }

            //drives
            public ArrayList Drives
            {
                get { return this._drives; }
                set { this._drives = value; }
            }

            //folders
            public string[] Folders
            {
                get { return this._folders; }
                set { this._folders = value; }
            }

            //File Paths
            public string[] FilePaths
            {
                get { return this._filePaths; }
                set { this._filePaths = value; }
            }

            #endregion

        }
    }
于 2012-08-19T19:31:24.030 に答える
0

lstNewItemsあなたのaspコードには何がありますか?

動作するには、Item[]. WCF コードを使用してもList<Item>、WCF によって生成されるプロキシ コードの既定の設定は、コレクションに配列を使用することです。

編集

最新の編集を行うと、問題を見つけることができます。

エラー メッセージは、FilesToControl プロキシItem[]メソッドが配列 ( )を受け入れることを示しています。

エラー 1 'test.ServiceReference1.JobsClient.FilesToControl(test.ServiceReference1.Item[])' に最適なオーバーロードされたメソッドに無効な引数があります

を渡しますList<Item>

List<Item> lstNewItems = new List<Item>();
//....
ControlFiles_Result = Client.FilesToControl(lstNewItems);

これを修正するには 3 つの方法があります。

  • 代わりlstNewItemsにタイプに変更してください。Item[]
  • サービス参照 (WCF を呼び出せるように追加したもの) の設定を変更しList<T>て、既定のコレクション型として使用します。
  • 配列に変換する呼び出しを変更します。

後者は、への呼び出しを介して実行できますToArray

ControlFiles_Result = Client.FilesToControl(lstNewItems.ToArray());
于 2012-08-18T15:40:12.983 に答える