我正在努力从webservice/webclient体系结构迁移到WCF体系结构。这个对象非常复杂,有很多嵌套的xsd和不同的命名空间。代理类是通过将Web引用添加到具有30多个webmethods的原始wsdl并使用xsd.exe生成缺失的SOAPFault对象来生成的。我的试点WCF服务仅包含1个webmethod,它与原始方法之一的确切语法相匹配:1个对象作为参数,返回1个其他对象作为结果值。我使用这些代理类来创建WCF接口,使用以下属性:接口上的XMLSerializerFormat和ServiceContract,来自原始wsdl的OperationContract,指定Action,ReplyAction,全部使用正确的名称空间。我使用SoapUI创建传入的客户端消息;我从原始的WSDL文件生成了一个项目(导致SoapUI项目有30多个方法),并在一个实现的WebMethod中创建了一个新的请求,将url更改为我的wcf webservice并发送消息。由于OperationContractAttribute中指定的(Reply-)Action,消息实际上被接收并正确地反序列化为一个对象。为了实现这一目标(40个小时的谷歌搜索),很多挫折让我使用了一个自定义端点,其中WCF'包裹标签'被删除,嵌套类型的命名空间得到纠正,并且生成的wsdl get变平(为了更好与其他工具兼容,然后MS VisualStudio)。将webclient迁移到WCF; WCF客户端序列化方法的参数名称
界面代码是这样的:
[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document, SupportFaults = true)]
[ServiceContract(Namespace = Constants.NamespaceStufZKN)]
public interface IOntvangAsynchroon
{
[OperationContract(Action = Constants.NamespaceStufZKN + "/zakLk01", ReplyAction = Constants.NamespaceStufZKN + "/zakLk01", Name = "zakLk01")]
[FaultContract(typeof(Fo03Bericht), Namespace = Constants.NamespaceStuf)]
Bv03Bericht zakLk01([XmlElement("zakLk01", Namespace = Constants.NamespaceStufZKN)] ZAKLk01 zakLk011);
当我使用一个Web客户端的代码来发送消息,一切正常。我的问题是,当我使用WCF客户端。我使用ChannelFactory < IOntvangAsynchroon>发送消息。但生成的xml看起来不同:它包含方法的参数名称!我花了很多时间来弄清楚这一个,但这里会发生什么:
正确的XML(剥离SOAP信封):
<soap:Body>
<zakLk01 xmlns="http://www.egem.nl/StUF/sector/zkn/0310">
<stuurgegevens>
<berichtcode xmlns="http://www.egem.nl/StUF/StUF0301">Bv01</berichtcode>
<zender xmlns="http://www.egem.nl/StUF/StUF0301">
<applicatie>ONBEKEND</applicatie>
</zender>
</stuurgegevens>
<parameters>
</parameters>
</zakLk01>
</soap:Body>
错误的XML:
<soap:Body>
<zakLk01 xmlns="http://www.egem.nl/StUF/sector/zkn/0310">
<zakLk011>
<stuurgegevens>
<berichtcode xmlns="http://www.egem.nl/StUF/StUF0301">Bv01</berichtcode>
<zender xmlns="http://www.egem.nl/StUF/StUF0301">
<applicatie>ONBEKEND</applicatie>
</zender>
</stuurgegevens>
<parameters>
</parameters>
</zakLk011>
</zakLk01>
</soap:Body>
注意' zakLk011'元素?它是我的界面中方法的参数名称!所以现在它是zakLk011,但是当我的参数名称是'zakLk01'时,xml似乎包含了上面标签的一些魔术副本,但没有命名空间。当然,你可以想象在发现它是参数名称之前发生的事情我疯了!
我现在已经创建了一个WCF服务,我不能再使用WCF客户端发送消息。为了清楚起见:该方法在我的webservice上使用WCF客户端调用,但参数对象为空。因为我使用自定义端点来记录传入的xml,所以我可以看到收到的消息正常,但语法错误!
WCF客户端代码:
ZAKLk01 stufbericht = MessageFactory.CreateZAKLk01();
ChannelFactory<IOntvangAsynchroon> factory = new ChannelFactory<IOntvangAsynchroon>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8193/Roxit/Link/zkn0310"));
factory.Endpoint.Behaviors.Add(new LinkEndpointBehavior());
IOntvangAsynchroon client = factory.CreateChannel();
client.zakLk01(stufbericht);
我不使用一个生成的客户端,我只是引用类似的我用于将web服务(共享库)。
编辑:当生成服务引用时,它会生成重复的类(不知道为什么..)。但是,当这些副本被删除时,客户端将使用正确的xml发送消息。但是我的架构需要共享库,所以这并不能帮助我。
任何人都可以帮我吗?我无法谷歌任何东西在这...