wcf传递列表作为方法参数

时间:2012-10-22 15:53:09

标签: c# wcf list generics

我有一个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[]'

我唯一要做的就是用其他网络服务填充列表。

这里的问题是什么,因为我传递的参数是列表,方法接受列表,有人请指出我正确的方向。

6 个答案:

答案 0 :(得分:3)

问题是,当您在WCF中创建服务引用时,默认情况下,WCF将为所有(非字典)集合类型使用数组。这将导致在服务中定义的方法如下:

public void SyncClient(List<Client> client)
{

在服务引用中映射为:

public void SyncClient(Client[] client)

这是一个可配置的选项 - 在“创建服务引用”对话框中,您可以让WCF使用List<T>而不是数组,在这种情况下您的代码将起作用。

或者,如果您愿意,可以在调用服务引用时将对象转换为数组(通过ToArray())。

答案 1 :(得分:3)

这取决于您添加服务参考的方式。

您可以修改代码以发送客户端[]

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

答案 2 :(得分:2)

你可以试试这个:

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

答案 3 :(得分:1)

在visual studio中添加服务引用以创建代理时,可能会发生这种情况。服务引用设置的“数据类型”部分具有“收集”类型的下拉列表。检查它是否设置为System.Collections.Generic.ListSystem.Array

除此之外,如果您有对定义合同的程序集的引用,您还可以检查Reuse types in referenced assemblies哪个生成的代理使用提供的程序集而不是创建新类型。

答案 4 :(得分:1)

我的建议...不要使用Visual Studio来生成代理类。如果你有一个WCF库中的所有对象和你的接口(没有实际的服务实现,因为它应该是分开的)为什么不直接扔进客户端并直接访问它。这就是你要做的所有事情......

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

然后是bam!你有你的代理(客户端),并且你正在重新使用你创建的所有DataContract类,包括他们可能想要利用的任何方法!查看this CodeProject了解更多信息。这不仅解决了我遇到的一个非常类似的问题,而且让我在DataContract对象中更灵活,所以我可以使用它们而不仅仅是传递数据。

这种方法可以让您在处理多个服务时免于麻烦,因为VS服务gererator喜欢创建一些与您当前命名空间相关的命名空间。如果你让图书馆发疯了。

如果您无权访问这些库,请不要完全不同意,因为您可以通过上面CodeProject Article中描述的方法对代码进行更新,并且还会对代码进行优化(包括命名空间)。

答案 5 :(得分: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);
}