0

我想List<string>[]在 Web 服务中返回并以 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();

发生了什么事,我怎样才能List<string>[]在 Windows 窗体一侧得到它?

此外,我似乎在这些行中有错误:

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

错误 :

无法自动进入服务器。连接到服务器机器 'blablabla' 失败。未知用户名或错误密码...

这个错误是什么意思,我怎样才能弄清楚该 Web 服务中的哪一行导致了这个错误?

4

1 回答 1

3

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

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

至于返回 string[][] 而不是 List[] - 这也是预期的行为,因为客户端应用程序不知道返回的集合的类型 - 代理类是基于 WSDL 文件自动生成的。实际上,您可以将其更改为使用 List<> 而不是数组。考虑 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;
}
于 2013-04-04T16:57:34.850 回答