我有以下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,从而为这些参数提供更多结构,但我无法理解如何使用它。
有什么想法吗?
提前致谢。
答案 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。