无法将源类型转换为目标类型

时间:2009-09-30 15:41:31

标签: c#

在我的一个测试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.txthttp://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项目)。

4 个答案:

答案 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(...);