我使用svcutil.exe为第三方外部asmx Web服务生成了一个代理类。
在我的开发机器上,一切正常但是当我部署到服务器时,我收到以下错误:
与TBS服务通信时发生错误:无法加载操作“ProcessNotificationAsync”,因为它具有System.ServiceModel.Channels.Message类型的参数或返回类型或具有MessageContractAttribute的类型以及其他不同类型的参数。使用System.ServiceModel.Channels.Message或使用MessageContractAttribute类型时,该方法不得使用任何其他类型的参数。
现在,我理解这个错误的原因是因为,根据MSDN:
您可以将Message类用作操作的输入参数,操作的返回值或两者。如果在操作中的任何位置使用Message,则适用以下限制: •操作不能包含任何out或ref参数。 •输入参数不能超过一个。如果参数存在,则它必须是Message或消息协定类型。 •返回类型必须为void,Message或消息合同类型。
当我查看生成的代码文件时,我看到:
public System.Threading.Tasks.Task<ProcessNotificationResponse> ProcessNotificationAsync(int aNotificationID, string aComponentParam)
似乎违反了上述规则,因为ProcessNotificationResponse是MessageContractAttribute,其他参数是基本类型。
为什么这可以在一台机器而不是另一台机器上运行?我希望两台机器都出错。
答案 0 :(得分:4)
我遇到了这个问题。两台开发电脑工作,生产电脑给出了这个错误。事实证明,它与.net 4.5支持ASYNC调用和.net 4.0不支持的事实有关。 生产计算机正在运行服务器2003,.net 4.5没有工作。
解决方案是将项目降级到.net 4.0并删除并重新添加引用。设置为.net 4.0时,它不会添加异步调用。它现在可以在生产计算机上运行。
如果生产计算机能够运行.net 4.5,安装.net 4.5就可以解决问题。
答案 1 :(得分:1)
我遇到了同样的问题。我正在调用一些第三方WCF服务。做了很多搜索。终于发现wcf服务是用FW 4.5版本构建的,我的asp.net网站是针对FW 3.5版本的。然后彻底检查了服务代理类,看到Service公开了一些Async方法,这些方法返回了FW 4.5版本的System.Threading.Tasks。只需评论所有FW 4.5相关代码。但幸运的是我的实际调用方法没有那些。事情开始很好。
另一个解决方案是将您的asp.net项目转换为FW 4.5版本。我用一个简单的测试应用程序测试了这个,没有在代理类中注释任何行,它也工作正常。