2014-02-05 132 views
0

我有以下WCF服务,我相信可以改进。我需要能够使用SOAP1.1和SOAP1.2来支持Windows和非Windows客户端。WCF服务和互操作性

我的疑虑是API InitDataRequest的输入参数initdata和GetData的返回参数。目前,我们制定了一项发展政策,即将这些参数限制为XML格式的字符串,客户端和服务器负责在各自的环境中进行序列化/反序列化。

[ServiceContract] 
public interface IAtomDataInterfaceWcf 
{ 
    [OperationContract] 
    Guid OpenSession(AtomSessionType sessiontype); 

    [OperationContract] 
    void CloseSession(Guid sessionid); 

    [OperationContract] 
    int InitDataRequest(Guid sessionid, string initdata); 

    [OperationContract] 
    string GetData(Guid sessionid, int count); 
} 

使用SoapUI,InitDataRequest的SOAP请求显示参数'initdata'的以下元素。

<tem:initdata>?</tem:initdata> 

这让我们期待别的东西的IBM Websphere开发人员感到困扰。他们建议,在没有任何指导的情况下,我使用XSD来描述API,从而为这些参数提供了更多的结构,但是我一直没能弄清楚如何使用它。

任何想法?

在此先感谢。

回答

2

对于您的服务合同,没有任何固有的不可互操作性。我不确定为什么你认为有改进的余地,除非联系人不支持其所要解决的商业原因。

您可以通过分别为每个basicHttpBinding和wsHttpBinding定义一个端点来通过soap 1.1和1.2公开该服务。

我不知道你这个是什么意思:

我们有一个发展的政策,这些参数被限制 是XML格式的字符串

肥皂是一种XML标准;所有非xml内容都必须格式化,否则最终会出现不良xml。这不是一项发展政策,而是技术约束。

我也不明白什么问题是用soapUI初始设置字符串值initdata为问号。你是否担心这在某种程度上不是有效的字符串?你意识到soapUI只是把“?”最初,你可以改变它到任何你想要的权利?

最后,如果你的服务的消费者说他们需要一个xsd,那么你可以到host a WSDL endpoint,他们可以去那个终端并从那里下载xsd。

1

上述问题的答案是正确使用KnownType属性。使用它可以让我重写我的接口,像这样:

[ServiceContract] 
public interface IAtomDataInterfaceWcf 
{ 
    [OperationContract] 
    int InitDataRequest(Guid sessionid, AtomDataRequest initdata); 

    [OperationContract] 
    Guid OpenSession(AtomSessionType sessiontype); 

    [OperationContract] 
    void CloseSession(Guid sessionid); 

    [OperationContract] 
    AtomDataResponse GetData(Guid sessionid, int count); 
} 

凡AtomDataResponse和AtomDataRequest具有以下结构。

[KnownType("GetKnownTypes")] 
[DataContract] 
public class AtomDataRequest 
{ 
    public static Type[] GetKnownTypes() 
    { 
     // load known types derived from AtomDataRequest and return as Type array 
    } 
} 

这些改变后,我的WSDL现在是一个丰富的文件,它允许消费者调用API的具有良好定义的对象而不是XML格式的字符串。