【问题标题】:Using DataContractResolver with AJAX-enabled wcf service将 DataContractResolver 与启用 AJAX 的 wcf 服务一起使用
【发布时间】:2011-12-13 15:21:23
【问题描述】:

我需要创建一个应该从 javascript 调用的 wcf 服务。服务定义如下:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class ClientRequestService : IClientRequestService
{
    [WebGet]
    [ApplyProxyDataContractResolver]
    public ResponseData ProcessClientRequest(String pageId)
    {
        ...
    }
}

这个方法应该返回一个我在编译时不知道其类型的对象。所以当它被调用时,我得到以下异常:

不应使用数据合同名称 ... 键入 ...。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。

我创建了自定义 DataContractResolver 并创建了一个实现接口 IOperationBehavior 的属性,以便将我的自定义 DataContractResolver 附加到我的服务。

public class ApplyProxyDataContractResolverAttribute : Attribute, IOperationBehavior
{
    public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
    {
        var dataContractSerializerOperationBehavior =
              description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
    }
}

ApplyDispatchBehavior 方法被成功调用,但我的自定义 DataContractResolver 的方法从未被调用,我得到了同样的异常。

我尝试使用 ServiceRoute 类或使用 svc 文件注册我的服务 - 无论如何它都不起作用。

【问题讨论】:

  • 您遵循了哪些文档来获得此解决方案?
  • 我遇到了同样的问题。有人回答了吗?

标签: .net wcf


【解决方案1】:

我认为,问题在于 WebHttpBehavior 和 WebScriptEnablingBehavior 已经插入了自己的序列化格式化程序,该格式化程序插入了自己的序列化操作行为,插入了自己的序列化程序。您的路径永远不会被调用,因为在所有序列化和反序列化时都会调用自定义序列化程序。

您需要做的是完全覆盖该路径。这是你如何做到这一点的。

如果您现在正在使用 WebHttpBehavior,请将其子类化。如果您改用 WebScriptEnablingBehavior,请将其子类化。

然后重写这两个方法:

System.ServiceModel.Description.WebHttpBehavior.GetDefaultClientFormatter(OperationDescription, Boolean, Boolean) : IClientMessageFormatter

System.ServiceModel.Description.WebHttpBehavior.GetDefaultDispatchFormatter(OperationDescription, Boolean, Boolean) : IDispatchMessageFormatter

要了解如何覆盖它们,请使用 Reflector 并查看它们在 WebHttpBehavior 和 WebScriptEnablingBehavior 中的默认实现。

您会注意到,您必须插入自己的操作格式化程序,然后插入自己的操作行为,然后插入新的序列化程序。看看 DataContractJsonSerializerOperationFormatter 和 DataContractJsonSerializerOperationBehavior 的实现,看看它们是如何使用和实例化的,明白我的意思。

我知道这可能比你想要的要多,但它比听起来更简单,它会让你做你想要的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多