如何在Web服务方法</string>中返回List <string> []

时间:2013-04-04 16:46:31

标签: c# winforms web-services return

我想在Web服务中返回List<string>[],并在Windows窗体中使用该返回值,如下所示:

    [WebMethod]
    public List<string>[] MyMethod()
    {
       ...
       ...

        List<string>[] list_ar = new List<string>[]{list_optgroup, list_option, list_optgroup_option};

        return list_ar;
    }

但是在Windows窗体方面我应该得到这样的返回值:

        MyService_Soft service = new MyService_Soft();
        string[][] str_ar = service.MyMethod();

发生了什么,如何在Windows窗体上获得List<string>[]

似乎我在这些行中也有错误:

        MyService_Soft service = new MyService_Soft();
        string[][] str_ar = service.FillComboBoxes(); 

错误:

  

无法自动进入服务器。连接到服务器   机器&#39; blablabla&#39; failed.unknown用户名或密码错误......

此错误的含义是什么?如何确定该Web服务中的哪一行会导致此错误?

1 个答案:

答案 0 :(得分:3)

我看到没有错误。您无法从一个调试过程同时调试2个进程。由于服务器代码在单独的进程中运行,因此无法进入它。

要调试服务器代码,请使用服务器项目源代码打开另一个MS Visual Studio实例(或您使用的任何IDE),然后转到菜单Debug - &gt;附加到进程,然后找到您的服务器服务托管进程,然后单击“附加”。

至于返回string [] []而不是List [] - 它也是预期的行为,因为客户端应用程序不知道返回集合的类型 - 代理类是基于WSDL文件自动生成的。实际上你可以改变它以使用List&lt;&gt;而不是数组。考虑WCF服务,打开WCF SErvice引用属性并选择集合类型(默认情况下为数组,但可以根据需要更改为List)。 但我认为没有理由要求获取List而不是数组。 唯一的区别是List是可变的。 您不应该在逻辑上希望能够更改返回的集合! 您最好创建一个新的集合,基于返回的数组并改为修改它。

更新:代码请求。

最后一条和主要建议的代码非常直接:

public List<string>[] SomeClientBuilsenessLogicMethod()
{
    var serviceClient = GetServiceClientInstance(); //you might want to have single instance (single connection) of WCF service client, so I implemented it's creation as factory method here.

    string[][] serviceData = serviceClient.MyMethod();

    List<string>[] mutableDataList = serviceData.Select(x=>x.ToList()).ToArray();//Not the best memory usage here probably (better is a loop), but for not big data lists it's fine.

    //Perform any needed operations for list changing. Again there is NO NEED to use List if you don't plan to add/remove items to/from that collection.

    return mutableDataList;
}