我已经看过SO和其他地方了解过这个问题以及一些对我来说仍然没有意义的答案。
我正在重构我正在使用的VStudio 2010解决方案:
新的VStudio 2010解决方案具有:
这是以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”来“参数的顺序无关紧要......它仍然会工作。”
我很担心这里要做什么(以及我做错了导致这个重新安排的订单以及为什么会发生这种情况)。
答案 0 :(得分:2)
首先,你没有做错任何事:)。即使客户端和服务器中的方法中的签名不同,它们也与它们将生成/使用的消息等效。您可以毫无问题地使用该代理类,它也可以正常工作。
为什么会发生这种情况是另一个故事 - 在服务描述(WSDL)中,每个(非单向)操作有两个“消息”:一个带有输入参数,一个带有输出参数。消息分别包含操作的输入和输出,但WSDL中没有任何内容显示它们的顺序。因此,当Add Service Reference或svcutil等工具生成客户端代理时,它只会“选择”一个订单(首先输出参数),但代理将发送给服务的请求将与服务器期望的内容兼容(并且,代理将正确理解服务器的响应。)
如果要维护参数的顺序,可以自己创建代理类。为此,您可以使用ChannelFactory<T>
类,也可以创建自己的ChannelBase<T>
派生类。但是你并不是真的需要这样做,正如我之前提到的那样。