【问题标题】:Send custom header for all WCF REST OPTION calls为所有 WCF REST OPTION 调用发送自定义标头
【发布时间】:2026-01-11 02:20:02
【问题描述】:

我正在尝试实现独立的 WCF REST 服务。我目前遇到的一个问题是我必须发送 WebGet 无法处理的自定义对象。所以我试图用 POST 而不是 GET 来发送它们。

现在我当然不能使用 POST 数据发出 JSONP 请求。要解决这个问题,我必须向使用“OPTIONS”HTTP 方法进行的所有调用发送一个 ALLOW-ORIGIN 标头。有没有

  • 一种将标头应用于每个 OPTION 调用的方法?
  • 一种在不设置[WebRequest(method = "*")](而不是[WebRequest(method = "POST")])的情况下拦截和允许所有OPTION调用的方法
  • 一种在不调用 WCF 方法的情况下添加标头并返回请求的方法?

或者,如何覆盖 WebGet 的参数序列化方法?

我已经尝试使用自定义 Endpoints 和 MessageDispatchers 来解决这个问题,但它似乎不起作用。

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    我想出了如何覆盖WebGet的参数序列化。 This question 为我指明了正确的方向。

    我只需要覆盖 HttpBehavior 并添加我自己的 QueryStringConverter,它使用 Newtonsoft JSON 序列化程序。

    
        public class CustomQueryStringConverter :System.ServiceModel.Dispatcher.QueryStringConverter
            {
                public override bool CanConvert(Type type)
                {
                    return true;
                }
    
                public override object ConvertStringToValue(string parameter, Type parameterType)
                {
                    if (base.CanConvert(parameterType))
                    {
                        return base.ConvertStringToValue(parameter, parameterType);
                    }
                    else
                    {
                        object param = Newtonsoft.Json.JsonConvert.DeserializeObject(parameter, parameterType);
                        return param;
                    }
                }
    
                public override string ConvertValueToString(object parameter, Type parameterType)
                {
                    if (base.CanConvert(parameterType))
                    {
                        return base.ConvertValueToString(parameter, parameterType);
                    }
                    else
                    {
                        return Newtonsoft.Json.JsonConvert.SerializeObject(parameter);
                    }
                }
            }
    

    这也消除了发送 OPTIONs 标头和 POST 数据的需要。

    【讨论】: