5

次のようなメソッドを持つ wcf サービスがあります。

 public void SyncClient(List<Client> client)
        {
         }

次に、このサービスを次のように参照する lib ソリューションでこれを呼び出します。

WCF.SyncClient wcfSer = new WCF.SyncClient();
 List<Client> clientModified = secondservice.Get_Clients(ModifiedDate, modifiedUnt).ToList();
wcfSer.SyncClient(clientModified);

しかし、私は次のエラーを受け取り続けます:

The best overloaded method match for 'SyncClient(SyncLib.ClientWCF.Client[])' has some invalid arguments    
cannot convert from 'System.Collections.Generic.List<SyncLib.Client>' to 'SyncLib.WCF.Client[]'

私が行っている唯一のことは、リストに別の Web サービスが取り込まれていることです。

私が渡している引数はリストであり、メソッドはリストを受け入れるため、ここでの問題は何ですか。誰かが私を正しい方向に向けてください。

4

6 に答える 6

3

これは、サービス参照を追加した方法にかかっています。

client[] を送信するようにコードを修正することもできます

WCF.SyncClient wcfSer = new WCF.SyncClient();
 var clientModified = secondservice.Get_Clients(ModifiedDate,
    modifiedUnt).ToArray();
wcfSer.SyncClient(clientModified);

または、参照を再度追加し、以下のように System.Collection.Generic.List を使用するオプションを選択します。

Select Add Reference
Select URL
Select Advanced when you have found the service.
In Datatype, you will see these options.

コレクションタイプを次のように選択しますSystem.Collection.Generic.List

于 2012-10-22T15:59:53.410 に答える
3

問題は、WCF でサービス参照を作成すると、既定で、WCF がすべての (辞書ではない) コレクション型に配列を使用することです。これにより、次のようにサービスで定義されたメソッドが発生します。

public void SyncClient(List<Client> client)
{

サービス参照で次のようにマップするには:

public void SyncClient(Client[] client)

これは構成可能なオプションです。[サービス参照の作成] ダイアログで、WCFList<T>に配列の代わりに を使用させることができます。この場合、コードは機能します。

ToArray()または、必要に応じて、サービス参照を呼び出すときに、( を介して) オブジェクトを配列に変換することもできます。

于 2012-10-22T15:57:38.633 に答える
2

これを試すことができますか:

WCF.SyncClient wcfSer = new WCF.SyncClient();
 Client[] clientModified = secondservice.Get_Clients(ModifiedDate, modifiedUnt).ToArray();
wcfSer.SyncClient(clientModified);
于 2012-10-22T15:56:37.183 に答える
1

私の提案...プロキシクラスを生成するためにVisualStudioを使用しないでください。すべてのオブジェクトとインターフェイスがWCFライブラリにある場合(実際のサービスの実装は、とにかく分離する必要があるため)、クライアントを投入して直接アクセスしないのはなぜですか。これがあなたがしなければならないすべてです...

public class MyWCFClient:ClientBase<IMyWCFServiceContract>, IMyWCFServiceContract
{
    //Implement the interface and call the channel
    public void SyncClient(List<Client> clients)
    {
        this.Channel.SyncClient(clients);
    }
}

それならバム!プロキシ(クライアント)があり、作成したすべてのDataContractクラスを再利用して、利用したいメソッドを含めます。詳細については、このCodeProjectを確認してください。これにより、私が抱えていた非常によく似た問題が解決されただけでなく、DataContractオブジェクトの柔軟性が大幅に向上したため、データを渡すだけでなく、それらを使用できるようになりました。

この方法では、VSサービスジェラレーターが現在の名前空間に関連する名前空間を作成するのが好きなので、複数のサービスをいじるときにも問題を回避できます。あなたが図書館を持っているなら、夢中になります。

これらのライブラリにアクセスできない場合でも、完全に無防備にしないでください。上記のCodeProjectの記事で説明されている方法でコードを生成し、コード(名前空間を含む)もカスタマイズできます。

于 2012-10-22T16:30:12.337 に答える
1

これは、Visual Studio でサービス参照を追加してプロキシを作成するときに発生する可能性があります。サービス参照設定のデータ型セクションには、コレクション型のドロップダウン リストがあります。System.Collections.Generic.Listまたは に設定されているかどうかを確認しますSystem.Array

これに加えて、コントラクトを定義するアセンブリへの参照がある場合はReuse types in referenced assemblies、新しい型を作成する代わりに、提供されたアセンブリを使用する生成されたプロキシを持つものを確認することもできます。

于 2012-10-22T15:58:30.480 に答える
0

これを試して:

StreamReader reader = new StreamReader(JSONdataLogin);
string JSONdata = reader.ReadToEnd();
JavaScriptSerializer jss = new JavaScriptSerializer();
List<WsShoeClass> OBJ = jss.Deserialize<List<WsShoeClass>>(JSONdata);

foreach (var Images in OBJ)
{  
    SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["conn"].ConnectionString);
    SqlCommand cmd = new SqlCommand("sp_UploadShoeImage", con);
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@UserId", Images.UserId));
    cmd.Parameters.Add(new SqlParameter("@ShoeId", Images.ShoeId));
    cmd.Parameters.Add(new SqlParameter("@ShoeImage", Images.ShoeImage));
    con.Open();
    SqlDataAdapter ad = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    ad.Fill(ds);
}
于 2016-12-23T07:50:45.587 に答える