我正在将示例VB客户端(从使用其WCF服务的第三方SDK)转换为C#。 VB中的客户端执行时,工作正常。
我在vs2015中用C#Windows Form编写一个小包装器来使用相同的WCF服务。我能够在VS2015中添加服务引用。
我在使用VB进行等效调用时遇到问题但由于某种原因在C#中,它不起作用,就好像生成的C#类不正确一样。
在工作样本VB中, 我有一个呼叫ContinueGetList
Dim siteList() As SRAdminSys.MW_DataContractCommon
Dim iRecCount As Integer = 20
Dim Status As SRAdminSys.MW_ContinueStatusEnum
Status = m_wcfSysDB.ContinueGetList(iRecCount, siteList)
该调用返回siteList中的列表,该列表是SRAdminSys.MW_DataContractCommon的数组
注意:我认为*实际的Web服务返回的数组是MW_Site类型,它继承了DataContractCommon - (*当我在C#等效调用中进行相同的调用时,我收到错误,当我检查错误时,它提到它将MW_Site转换为MW_DataContractCommon) - 请参阅下面的进一步测试。
Partial Public Class MW_Site
Inherits SRAdminSys.MW_DataContractCommon
Generated Proxy Class中的Reference.vb:
Public Function ContinueGetList(ByVal iCount As Integer, ByRef list() As SRAdminSys.MW_DataContractCommon) As Integer Implements SRAdminSys.IMW_KWSAdminSysDatabase.ContinueGetList
Return MyBase.Channel.ContinueGetList(iCount, list)
End Function
现在在C#中的非工作原型(虽然它确实可以编译),
int[] lst_SiteIds = new int[] { };
int iRecCount = 20;
SRAdminSys.MW_ContinueStatusEnum status;
status = (SRAdminSys.MW_ContinueStatusEnum)adminSysClient.ContinueGetList(iRecCount,ref siteList);
返回值状态表明调用失败,当我检查错误时 - 一个WCF方法GetLastError(),我得
Unable to cast object of type 'MW_DataContractCommon[]' to type 'MW_Site[]'.
当我检查由C#Service Reference生成的MW_Site Partial类时,我注意到它继承了DataContractCommon,所以我希望它可以工作:
public partial class MW_Site : SRAdminSys.MW_DataContractCommon {
Reference.cs
public int ContinueGetList(int iCount, ref TestUtil.SRAdminSys.MW_DataContractCommon[] list) {
TestUtil.SRAdminSys.ContinueGetListRequest inValue = new TestUtil.SRAdminSys.ContinueGetListRequest();
inValue.iCount = iCount;
inValue.list = list;
TestUtil.SRAdminSys.ContinueGetListResponse retVal = ((TestUtil.SRAdminSys.IMW_KWSAdminSysDatabase)(this)).ContinueGetList(inValue);
list = retVal.list;
return retVal.ContinueGetListResult;
}
CWUtility.SRAdminSys.ContinueGetListResponse retVal = ((CWUtility.SRAdminSys.IMW_KWSAdminSysDatabase)(this)).ContinueGetList(inValue);
list = retVal.list;
return retVal.ContinueGetListResult;
}
关于DataContractCommon的部分类和继承 - 另一个示例代码在VB中工作但在C#中指向同一个WCF服务时不工作。唯一的区别是VB App与C#App,它指向VS服务参考中各自生成的代理类。
Dim sitekey__ As New SRAdminSite.MW_Key
bRet = m_wcfSiteDB.Add(1, eKEY_COLLECTION, sitekey__)
VB, Reference.vb
Public Function Add(ByVal iSiteID As Integer, ByVal iCollectionType As Integer, ByRef iRecord As SRAdminSite.MW_DataContractCommon) As Boolean Implements SRAdminSite.IMW_KWSAdminSiteDatabase.Add
Return MyBase.Channel.Add(iSiteID, iCollectionType, iRecord)
End Function
SRAdminSite.MW_Key sitekey__ = new SRAdminSite.MW_Key();
//COMPILE ERROR on sitekey__ although MW_Key is a partial class which inherits MW_DataContractCommon
bRet = adminSiteClient.Add(1, (int)SRAdminSite.MW_SiteCollectionTypesEnum.eKEY_COLLECTION, ref sitekey__);
C#, Reference.cs
public bool Add(int iSiteID, int iCollectionType, ref SRAdminSite.MW_DataContractCommon iRecord)
{
SRAdminSite.AddRequest inValue = new SRAdminSite.AddRequest();
inValue.iSiteID = iSiteID;
inValue.iCollectionType = iCollectionType;
inValue.iRecord = iRecord;
SRAdminSite.AddResponse retVal = ((SRAdminSite.IMW_KWSAdminSiteDatabase)(this)).Add(inValue);
iRecord = retVal.iRecord;
return retVal.AddResult;
}
因此,这些示例似乎都与生成WCF服务的代理类的方式有关,并且继承了其他类但无法工作。在第二个示例中,错误发生在编译时......
任何人都可以解释一下,为什么在VB中默认生成的类在调用时有效,但在c#中,对同一方法的相同等效调用不起作用? 我已经消耗了其他第三方WCF服务,通常,导入服务参考并使用这些方法是轻而易举的......
由于某种原因,这个,我无法解决为什么它不起作用。在我使用它之前,是否有一些我缺少或需要修改Reference.cs的方式?