C# Web服务方法签名更改为数据类型字符串[]的请求/响应对象

C# Web服务方法签名更改为数据类型字符串[]的请求/响应对象,c#,asp.net,wcf,web-services,C#,Asp.net,Wcf,Web Services,我有两个网站,都使用.NETFramework 3.5。一个网站托管soapweb服务,另一个网站引用此服务。 我的web方法签名出现了一些意外情况。我的web服务中有一个简单的方法,其签名如下: [WebMethod] public string[] HelloWorld() { return new[] { "Hello World" }; } 但是,当我使用VS2008中的“添加服务引用”功能引用此web服务时,配置设置为“始终生成消息契约”(尽管当我检查“引用的程序集中的重用类

我有两个网站,都使用.NETFramework 3.5。一个网站托管soapweb服务,另一个网站引用此服务。 我的web方法签名出现了一些意外情况。我的web服务中有一个简单的方法,其签名如下:

[WebMethod]
public string[] HelloWorld()
{
    return new[] { "Hello World" };
}
但是,当我使用VS2008中的“添加服务引用”功能引用此web服务时,配置设置为“始终生成消息契约”(尽管当我检查“引用的程序集中的重用类型”时,我似乎有相同的问题),签名似乎被自动生成的代理对象更改为以下内容:

HelloWorldResponse HelloWorld(HelloWorldRequest request)
我曾尝试在网上查找,但很难找到一些简单的解释来解释为什么会发生这种情况,以及我是否可以/应该尝试解决它

我还有一个问题: 如何确定他们是否应该选择服务引用配置选项“重用引用程序集中的类型”和“始终生成的消息协定”?

该选项可能会产生这种效果;这里的目的是允许对底层请求进行细粒度控制。最终,您(在幕后)发送的是一个请求负载

重用类型选项通常用于对象(而不是像
string[]
)——这意味着如果您在本地有一个100%匹配的
Customer
(比如)类,它可以将其重新用于web服务,而不是生成代理类型

此外,请注意,您实际上并没有使用WCF服务(
[WebMethod]
是较旧的web服务样式)。因此,你可能会有更好的结果与“网络参考”;添加服务时,点击“高级”,然后点击“添加Web引用…”。这将使用较旧的UI和wsdl.exe生成用于
[WebMethod]
(asmx)而不是WCF(svc)的代码

当然,您可以(因为服务器也是3.5版)托管WCF服务,而不是托管
[WebMethod]
;这可能会让事情变得更容易


WCF的最后一点;如果您确实希望在客户端和服务器上使用相同的契约,那么您可以使用程序集或类共享在两端使用完全相同的类型。但是,
[WebMethod]
不支持这一点。

++1建议对服务使用WCF。OP:Microsoft认为ASMX是“遗留技术”。因为您已经在为客户机使用它,所以应该开始为您的服务使用它。