2011-04-12 148 views
3

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

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

  • 一种将标题应用于每个OPTION调用的方法?
  • 拦截并允许所有期权调用,无需设置[WebRequest(method = "*")](而不是[WebRequest(method = "POST")]
  • 一种添加页眉和没有它调用WCF方法返回请求的方法吗?

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

我已经尝试过使用自定义端点和MessageDispatchers解决这个问题,但它似乎并没有工作。

回答

1

我想通了^ h ow覆盖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数据的需要。