具有4个输入参数和3个参数的WCF服务由“代理类项目”中的“添加服务引用”重新排序

时间:2011-12-07 18:22:07

标签: wcf web-services proxy-classes out operationcontract

我已经看过SO和其他地方了解过这个问题以及一些对我来说仍然没有意义的答案。

我正在重构我正在使用的VStudio 2010解决方案:

  • 一个带有ASMX webservice的项目
  • 代理类的另一个单独项目(除了添加Web引用
  • 生成的内容之外,此处没有代码
  • 客户端的另一个单独项目(包含对该客户端的引用) ProxyClass.dll

新的VStudio 2010解决方案具有:

  • 合同类型为WCF服务库的一个项目( IFileService.cs ) 一个用于实现合同的WCF服务库类型的项目( FileService.cs
  • 代理类的另一个单独项目(除了添加服务参考
  • 生成的内容之外,此处没有代码
  • 客户端的另一个单独项目(包含对WCFProxyClass.dll的引用)

这是以3个参数结束的合约(并且相同的顺序是相同的顺序):

[ServiceContract(Name = "IFileService", Namespace =  "http://www.cbmiweb.com/TrimWCF/2011/11")]
public interface IFileService
{
    [OperationContract]
        public string DownloadFile(string trimURL
         , string TrimRecordNumber
         , string CallerPC
         , string RequestorID
         , out byte[] docContents
         , out string returnFiletype
         , out string returnFilename)
    {

以下是在我的代理类项目中生成的添加服务引用:

public string DownloadFile(
  out byte[] docContents
, out string returnFiletype
, out string returnFilename
, string trimURL
, string TrimRecordNumber
, string CallerPC
, string RequestorID) 
{
    return base.Channel.DownloadFile(out docContents, out returnFiletype, out returnFilename, trimURL, TrimRecordNumber, CallerPC, RequestorID);
}

我已阅读的答案范围从“你不能在WCF中使用参数”到“你不应该使用添加服务参考但是使用svcutil.exe”来“参数的顺序无关紧要......它仍然会工作。”

我很担心这里要做什么(以及我做错了导致这个重新安排的订单以及为什么会发生这种情况)。

1 个答案:

答案 0 :(得分:2)

首先,你没有做错任何事:)。即使客户端和服务器中的方法中的签名不同,它们也与它们将生成/使用的消息等效。您可以毫无问题地使用该代理类,它也可以正常工作。

为什么会发生这种情况是另一个故事 - 在服务描述(WSDL)中,每个(非单向)操作有两个“消息”:一个带有输入参数,一个带有输出参数。消息分别包含操作的输入和输出,但WSDL中没有任何内容显示它们的顺序。因此,当Add Service Reference或svcutil等工具生成客户端代理时,它只会“选择”一个订单(首先输出参数),但代理将发送给服务的请求将与服务器期望的内容兼容(并且,代理将正确理解服务器的响应。)

如果要维护参数的顺序,可以自己创建代理类。为此,您可以使用ChannelFactory<T>类,也可以创建自己的ChannelBase<T>派生类。但是你并不是真的需要这样做,正如我之前提到的那样。