在我的一个测试Web项目中的.aspx的代码隐藏中,我正在尝试将此变量设置为返回的对象。我在我的网站项目中得到了对Web服务的引用,这很好。
我正在调用我们的一种Web服务方法:
CompanyName.CC.DebitResponse debitRespnose = CCService.IssueDebit(...);
.asmx中的IssueDebit返回类型CompanyName.CC.DebitResponse。
但是我收到了这个错误:
"Cannot convert source type MyWebTestProject.CCService.DebitResponse to target type CompanyName.CC.DebitResponse"
我的意思是我正在设置的变量,并且我服务中的方法中定义的返回类型完全相同。那为什么会抱怨?
在我的网络服务中,这是IssueDebit:
public DebitResponse IssueDebit(...)
{
...
}
我确信IssueDebit中的DebitResponse的类型为CompanyName.CC.DebitResponse
更新。
好的,我很困难。这是实际的代码(在我为了隐私目的而更改名称之前)。请不要重新粘贴任何此类(或者如果你因为敏感而大幅更改名称)
http://www.elbalazo.net/post/codebehind.txt和 http://www.elbalazo.net/post/webservice.txt
这是真正的代码。在后面的代码中查看IssueDebit。
我在测试Web项目中使用的Web服务引用名为LitleService。
当我在对象资源管理器中查看该服务时,我注意到它的类型存在冲突。那么,如果我没有在我的.asax中定义那个类,为什么那个类型会在我的服务中?
http://www.elbalazo.net/post/webservice_objectexplorer.jpg
在我的代码隐藏中抄写的另一种方法中,我在这里得到了关于参数的不明确的参考:
private void SetIssueDebitResults(ServiceAuthResponse response)
{
//not implemented
}
Ambiguous Reference:
xxx.Litle.ServiceAuthResponse
WebServiceTesting.LitleService.ServiceAuthResponse
那么当实际的ServiceAuthResponse类的起源和定义在xxx.Litle.ServiceAuthResponse中时,为什么我会在我的Litle服务中获得ServiceAuthResponse对象...一个完全不同的项目?我在两个Web项目中都引用了该程序集(测试项目和包含实际.asmx的Web项目)。
答案 0 :(得分:1)
我打赌你的webservice方法有意或无意地返回了错误的类型。
尝试将它放在webservice类的顶部:
using DebitResponse = CompanyName.CC.DebitResponse;
然后将方法调用更改为:
public DebitResponse IssueDebit(variable)
{
// stuff...
}
如果您发布IssueDebit()
方法的代码,则会有所帮助。
答案 1 :(得分:0)
似乎他混淆了不同的命名空间......如果变量完全相同,那么你可以投射它。
CompanyName.CC.DebitResponse debitRespnose = (CompanyName.CC.DebitResponse)CCService.IssueDebit(...);
答案 2 :(得分:0)
进一步沿着鲍比的回答,你试过这个吗?
CompanyName.CC.DebitResponse debitResponse =
CCService.IssueDebit(...) as CompanyName.CC.DebitResponse;
答案 3 :(得分:0)
据我所知,.NET 2.0 Web服务(asmx)会自动为WSDL中调用方法(参数和返回类型)所需的类型生成映射。
当您将webservice作为Web引用添加到其他项目(在本例中为您的网站)时,会自动生成代理类。在您的情况下,这些是MyWebTestProject.CCService命名空间中的那些。我不确定您的DebitResponse代码究竟是什么,但您的错误消息显示错误:
“无法将源类型MyWebTestProject.CCService.DebitResponse转换为目标类型CompanyName.CC.DebitResponse”
为您调用Web服务的代理类返回的类型不是您在Web服务中使用的CompanyName.CC.DebitResponse类型。它是从WSDL生成的类,更具体地说是:MyWebTestProject.CCService.DebitResponse。它将包含与您在Web服务中使用的类相同的所有数据,但它是一个截然不同的类。另一方面,Web服务中类上存在的方法不存在。
所以,简单地说:你必须使用:
MyWebTestProject.CCService.DebitResponse debitResponse = CCService.IssueDebit(...);