原因.net WCF客户端使用RPC / encoded而不是Document / Literal / Wrapped与Delphi服务

时间:2011-03-14 07:33:58

标签: .net wcf delphi interop rpc

我有一个基于Delphi服务构建的.Net WCF客户端/代理。 Delphi服务以我的客户端无法处理的格式提供SOAP消息。

基于这里的指导:Delphi SOAP Envelope and WCF我已经明白WCF希望“Document / Literal / Wrapped”样式成为消息序列化的方式。事实证明,Delphi服务使用“rpc”作为样式。

我无法让delphi服务改变它的风格。

有没有办法告诉WCF客户端改为使用“rpc”。

供参考,这是我正在构建的Delphi服务:http://www.tntschools.com/AkiTimeTableService/wsdl/ICourses

1 个答案:

答案 0 :(得分:4)

以这种方式添加服务引用时,每个生成的消息协定的装饰方式与下面一样:

[DebuggerStepThrough]
[GeneratedCode( "System.ServiceModel", "4.0.0.0" )]
[MessageContract( WrapperName = "GetCourseList", WrapperNamespace = "urn:CoursesIntf-ICourses",
    IsWrapped = true )]
public partial class GetCourseListRequest
{
    [MessageBodyMember( Namespace = "", Order = 0 )]
    public string licence;

    public GetCourseListRequest()
    {
    }

    public GetCourseListRequest( string licence )
    {
        this.licence = licence;
    }
}

每个生成的操作合同的装饰方式如下:

[GeneratedCode( "System.ServiceModel", "4.0.0.0" )]
[ServiceContract( ConfigurationName = "ServiceReferences.ICourses" )]
public interface ICourses
{
    [OperationContract( Action = "urn:CoursesIntf-ICourses#GetCourseList", ReplyAction = "*" )]
    [XmlSerializerFormat( Style = OperationFormatStyle.Rpc, SupportFaults = true,
        Use = OperationFormatUse.Encoded )]
    [ServiceKnownType( typeof( TCourse ) )]
    GetCourseListResponse GetCourseList( GetCourseListRequest request );

    // Remaining operation contracts omitted
}

检查Reference.cs以确定您的消息和操作合同是否以相同方式修饰。如果是,问题就在于其他地方。异常消息有助于追踪问题(例如,它可能是返回的SOAP消息中元素的顺序)。