WCF服务和互操作性

时间:2014-02-05 22:37:06

标签: .net wcf xsd

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

我关心的是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 个答案:

答案 0 :(得分:2)

您的服务合同没有任何本质上不可互操作的内容。我不确定为什么你认为有改进的余地,除非联系人不支持它为解决的业务原因。

通过分别为basicHttpBinding和wsHttpBinding定义端点,可以通过soap 1.1和1.2公开服务。

我不知道你的意思是什么:

  

我们有一个限制参数的开发策略   是XML格式的字符串

肥皂是一种xml标准;必须格式化所有非xml内容,否则最终会出现错误的xml。这不是一项发展政策,而是一项技术限制。

我也不明白soapUI最初将字符串值 initdata 设置为问号的问题。您是否担心这在某种程度上不是有效的字符串?你确实意识到soapUI只是把“?”最初,您可以将其更改为您想要的任何内容吗?

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

答案 1 :(得分: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现在是一个丰富的文档,它允许使用者使用定义良好的对象而不是XML格式的字符串来调用API。