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

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

public void SyncClient(List<Client> client)
{

在服务参考中映射为:

public void SyncClient(Client[] client)

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

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

于 2012-10-22T15:57:38.633 回答
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 回答
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

当您在 Visual Studio 中添加服务引用以创建代理时,可能会发生这种情况。服务参考设置的数据类型部分有一个集合类型的下拉列表。检查它是否设置为System.Collections.Generic.ListSystem.Array

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

于 2012-10-22T15:58:30.480 回答
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);
    }
}

然后砰!您有您的代理(客户端),并且您正在重新利用您创建的所有 DataContract 类,以包含您可能想要利用的任何方法!查看此 CodeProject以了解更多信息。这不仅解决了我遇到的一个非常相似的问题,而且还让我的 DataContract 对象更加灵活,因此我可以将它们用于传递数据的更多用途。

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

如果您无权访问这些库,请不要完全忽视,因为您可以通过上述CodeProject 文章中描述的方法生成代码并自定义代码(包括命名空间)。

于 2012-10-22T16:30:12.337 回答
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 回答