我想在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服务中的哪一行会导致此错误?
答案 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;
}