WCF生成的类

时间:2017-08-01 03:16:35

标签: c# wcf partial-classes

我正在将示例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的方式?

0 个答案:

没有答案