WCF服务C#调用另一个WCF服务VB

时间:2018-07-10 07:55:45

标签: c# asp.net vb.net wcf

通常,我必须进行一个项目来进行改进,而以前的开发人员已不在公司中。 我在C#中有一个WCF服务,在VB中调用了另一个WCF服务。 C#项目具有VB WCF服务的“服务参考”。

它目前可以在产品中使用,但我真的不知道如何。 在C#服务中,我们使用DTO,输入法类似于Toto(classDTO1 class1,classDTO2 class2),而VB侧类似于Toto(classType1 class1,classType2 class2)。

我有C#端:

[ServiceContract()]
public interface IWcfService
{
    [XmlSerializerFormat()]
    [OperationContract()]
    responseDTO Toto(classDTO1 class1, classDTO2 class2);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]    
public class WcfService: IWcfService
{
        public reponseDTO Toto(classDTO1 class1, classDTO2 class2)
        {
                ...
                using(WcfServiceVB clientVB = new WcfServiceVB())
                {
                        responseDTO rep = clientVB.Toto(class1, class2);
                        clientVB.Close();
                }
                ...
        }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(TypeName = "classType1", Namespace = "http://namespace/")]
public class classDTO1
{
        [XmlElementAttribute(ElementName = "Prop1", IsNullable = true)]
        public string Prop1{ get; set; }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlTypeAttribute(TypeName = "classType2", Namespace = "http://namespace/")]
public class classDTO2
{
        [XmlElementAttribute(ElementName = "Prop1", IsNullable = true)]
        public string Prop1{ get; set; }
}

public class eligibiliteAOGOut
{
    public DateTime CreaDate { get; set; }
    public string Message { get; set; }
}

和VB端:

<ServiceContract()> _
Public Interface IWcfServiceVB

        <XmlSerializerFormat>
        <OperationContract()>
        Function Toto(ByVal class1 As classType1, ByVal class2 As classType2) As responseType

End Interface

Public Class WcfServiceVB Implements IWcfServiceVB

        Public Function Toto(class1 As classType1, devis As devisType) As eligibiliteAOGOut Implements ILBPNoriaWcfService.eligibiliteAOG

                ...
                Dim response as responseType
                ...

        End Function

End Class

<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.33440"),
System.SerializableAttribute(),
System.Diagnostics.DebuggerStepThroughAttribute(),
System.ComponentModel.DesignerCategoryAttribute("code"),
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://namespace/")>
Partial Public Class classType1

        <System.Xml.Serialization.XmlElementAttribute(IsNullable:=True)>
        Public Property Prop1() As String
                ...
        End Property
End Class

<System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.33440"),
System.SerializableAttribute(),
System.Diagnostics.DebuggerStepThroughAttribute(),
System.ComponentModel.DesignerCategoryAttribute("code"),
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://namespace/")>
Partial Public Class classType2

        <System.Xml.Serialization.XmlElementAttribute(IsNullable:=True)>
        Public Property Prop1() As String
                ...
        End Property
End Class

Public Class responseType

        Public Property CreaDate As DateTime
        Public Property Message As String

End Class

所以,我不明白他是如何将我的DTO转换为Type的。 如果我通过Visual Studio更新“服务参考”(例如,指向产品中的现有VB服务),它将修改我的Reference.cs文件(除其他外),并且解决方案不再编译。他不再能够像以前一样将DTO转换为Type。

关心的是,现在我必须添加一个新的方法VB端,它将由新的方法C#端调用。 如果我自动更新了引用,它将不再起作用,并且如果我手动修改Reference.cs文件以添加新方法,则可以编译它,但在运行时会收到错误消息:

  

意外错误,请与管理员联系。提供事件编号(如果有)。(事件编号bfbb876f-98ae-4b29-a405-11fdfe82c872

     

说明:无例外,不可转让。   执行需求的网络操作。孔雀石的踪影   倒入带有错误代码的信息。

     

详细信息:System.ServiceModel.FaultException:意外   错误,请与管理员联系。提供事件编号,如果   任何。(事件编号bfbb876f-98ae-4b29-a405-11fdfe82c872

我完全被这条消息所困扰。 有关如何使其工作的任何想法? ;)

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案,我的一个属性在C#服务中为空,而在我的VB服务中不为空。尚不清楚.net如何反序列化我的DTO类以创建TypeClass,但至少现在可以正常工作。

要发现问题,我添加了web.config的服务行为,并添加了跟踪(https://docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/tracing/configuring-tracing)(如果它可以帮助某人)。