服务引用错误-使用MessageContractAttribute和其他类型参数的操作
本文关键字:其他 类型参数 操作 MessageContractAttribute 引用 错误 使用 服务 | 更新日期: 2023-09-27 18:07:50
我已经使用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和其他参数基本类型。
为什么这在一台机器上工作而在另一台机器上不行?
我有这个确切的问题。两台开发计算机工作,生产计算机给出这个错误。事实证明,这与。net 4.5支持ASYNC调用而。net 4.0不支持有关。生产计算机运行的是server 2003,而。net 4.5无法运行。
解决方案是将项目降级到。net 4.0,删除并重新添加参考。当设置为。net 4.0时,它不会添加Async调用。它现在可以在生产计算机上运行。
如果生产计算机能够运行。net 4.5,那么安装。net 4.5就可以解决这个问题。
我也面临同样的问题。我打电话给第三方WCF服务。做了大量的搜索。最后发现wcf服务是建立在FW 4.5版本,而我的asp.net网站是针对FW 3.5版本。然后仔细检查Service代理类,发现Service暴露了一些返回FW 4.5版本System.Threading.Tasks的异步方法。简单地注释了所有FW 4.5相关的代码。但幸运的是,我的实际调用方法没有这些。事情开始进展顺利。
另一个解决方案是将asp.net项目转换为FW 4.5版本。我用一个简单的测试应用程序测试了这一点,没有在代理类中注释任何行,它也工作得很好。