2

我已经查看了 SO 和其他地方,并看到了与此相关的问题以及一些对我来说仍然没有意义的答案。

我正在重构我的工作 VStudio 2010 解决方案,它具有:

  • 一个带有 ASMX 网络服务的项目
  • 代理类的另一个单独项目(这里没有代码,除了由Add Web Reference生成的代码
  • 客户端的另一个单独项目(包含对 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”到“参数的顺序无关紧要......它仍然可以工作”的答案。

我对在这里做什么感到困惑(以及我做错了什么导致这个重新安排的订单以及为什么会发生这种情况)。

4

1 回答 1

2

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

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

如果要保持参数的顺序,可以自己创建代理类。为此,您可以使用ChannelFactory<T>该类,也可以创建自己的从ChannelBase<T>. 但正如我之前提到的,你真的不需要这样做。

于 2011-12-07T18:38:51.420 回答