【问题标题】:WCF XML Serialization & OverloadingWCF XML 序列化和重载
【发布时间】:2009-12-15 15:28:24
【问题描述】:

在我的 WCF 服务中,我只需要 1 个端点(1 个 URI),但是,我希望这个 URI 能够处理多种类型的请求。可以从另一家公司向此服务发送 5 种不同的请求类型。每个请求都有一个唯一的 XML 模式。

我为每个要序列化的 XML 请求创建了类。通常我只会在参数不同时重载一个函数....但是在这种情况下我不能这样做,因为我的 WCF 函数的 UriTemplate 是相同的,并且在我尝试运行应用程序时抛出错误(说 UriTemplate 必须是独一无二的)。

在每个 XML 请求中都有一个名为“requestType”的节点。我试图了解其他人会做什么......我应该自己序列化并忽略 DataContract 的内置序列化吗?我应该将我的函数设置为接受什么类型的参数...然后基于 requestType 分支到请求特定逻辑的 XMLDocument?

根据请求类型,此函数返回的 XML 也是唯一的....但是我无法从 OperationContract 返回 XMLDocument...引发更多错误(我认为是因为它说它不能被序列化)。

我尝试创建一个可以通过设置从所有请求类型序列化的类

IsRequired = false, EmitDefaultValue = false

...在不同请求类型之间不共享的对象的 DataMembers 上。我现在遇到了一个问题,必须为每个 DataMember 正确设置 Order ,否则它根本不会序列化到我的类对象中......我原以为不必设置 Order : /

编辑:

这就是我现在使用的... XML 已发布到我的服务。

[WebHelp(Comment = "comment")]
[WebInvoke(UriTemplate = "foobar",
            Method = "POST",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Xml)]
[OperationContract]
public ResponseType foobar(ReqeustType request)
...

测试时我会将 XML 发布到 http://localhost:4011/XMLWCF/Service.svc/foobar

【问题讨论】:

    标签: xml wcf serialization xml-serialization


    【解决方案1】:

    我会有一个服务端点,例如一个 URL,但我会在您的服务合同中明确定义五种独立的、独特的服务方法,并分别实现它们。

    在我看来,这是迄今为止最简单、最干净的解决方案。

    [ServiceContract(Namespace=".......")]
    interface IYourService
    {
       [OperationContract]
       ReturnValue1 YourMethodNo1(int a, int b);
    
       [OperationContract]
       ReturnValue2 YourMethodNo2(........);
    
       [OperationContract]
       ReturnValue3 YourMethodNo3(..........);
    
       [OperationContract]
       ReturnValue4 YourMethodNo4(...........);
    
       [OperationContract]
       ReturnValue5 YourMethodNo5(........);
    }
    

    你不能真的只有一个服务方法来获取五种不同类型的参数。此外,WCF 不支持方法重载——因为 WSDL 不支持它。您的所有方法都必须具有唯一的名称,并且必须具有已定义和明确的参数类型。

    可以使用Message 类型的一般参数 - 但在我看来,这确实很麻烦。这个MSDN page 或这个blog post 阐明了如何做到这一点 - 如果你真的想......

    更新:在我描述的这种情况下,您将拥有 一个 服务 URL - http://site.com/service.svc

    从该服务 URL,您将在客户端创建一个客户端代理,它有五个方法可以调用:

    (伪代码):

    class ClientProxy
    {       
       ReturnValue1 YourMethodNo1(int a, int b);
       ReturnValue2 YourMethodNo2(........);
       ReturnValue3 YourMethodNo3(..........);
       ReturnValue4 YourMethodNo4(...........);
       ReturnValue5 YourMethodNo5(........);
    }
    

    然后,您可以从您的客户端代码调用以下五种方法中的任何一种:

    ReturnValue1  result = ClientProxy.YourMethodNo1(5, 7);
    

    但所有都将转到单一服务 URL

    【讨论】:

    • 我更新了我的问题...如果我没有在 WebInvoke 上定义 UriTemplate,我不确定如何调用该服务,因为请求已发布到此服务。我只是发布到服务链接本身,它就被炸毁了。你是说我可以将 xml 发布到同一个 URL 并让 .Net 自动确定哪个函数被命中?那是我一无所知的。
    • 从你上面的例子,我的理解有限......这些函数可以从site.com/service.svc/YourMethodNo1site.com/service.svc/YourMethodNo2site.com/service.svc/YourMethodNo3等访问,这是我想要避免的
    • @Chris:不,这不正确 - 所有五个函数都将在 site.com/service.svc 作为服务 URL 访问。
    • 客户端代码不可访问。唯一的规定是:xml 将以 text/xml 格式发布,我们需要提供一个端点。
    • 也许我可以按照您的建议构建它,然后创建一个简单的 aspx 文件,该文件采用发布的 xml,然后调用适当的 WCF 函数并返回数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多