WCF REST - 使用复杂类型的“获取”

Posted

技术标签:

【中文标题】WCF REST - 使用复杂类型的“获取”【英文标题】:WCF REST - "Get" using complex types 【发布时间】:2013-06-30 11:23:40 【问题描述】:

我有一个 WCF 4 RESTful Web 服务,它必须在 GET(它的 JSONP)上使用。我向该服务添加了一个需要复杂类型参数的方法。

[OperationContract]
[WebGet(RequestFormat=WebMessageFormat.Json)]
void InsertEventActionList(string pageViewGUID, 
                             List<EventActionItem> eventActionItemList);

然后我得到了错误:

Operation 'InsertEventActionList' in contract 'ITrackingService' 
has a query variable named 'eventActionItemList' of type 
'System.Collections.Generic.List`1[EventActionItem]', but type 
'System.Collections.Generic.List`1[EventActionItem]' is not convertible by 
'QueryStringConverter'.  Variables for UriTemplate query values 
must have types that can be converted by 'QueryStringConverter'.

好的,所以使用这篇文章 - http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/09/wcf-extensibility-querystringconverter.aspx 我创建了一个附加到行为扩展的自定义 QueryStringConverter:

[DataContract]
public class EventActionItem

    [DataMember]
    public string ActionName  get; set; 

    [DataMember]
    public string ActionValue  get; set; 

    [DataMember]
    public string ActionCategory  get; set; 


public class EventActionItemQueryStringConverter : QueryStringConverter

    public override bool CanConvert(Type type)
    
        return type == typeof(List<EventActionItem>) || base.CanConvert(type);
    

    public override object ConvertStringToValue(string parameter, Type parameterType)
    
        if (parameterType == typeof(List<EventActionItem>))
        
            List<EventActionItem> item = JsonConvert.DeserializeObject<List<EventActionItem>>(parameter);

            if (item != default(List<EventActionItem>))
            
                return item;
            
        

        return base.ConvertStringToValue(parameter, parameterType);
    


public class TrackingWebHttpBehavior : WebHttpBehavior

    protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
    
        return new EventActionItemQueryStringConverter();
    


public class TrackingBehaviorExtension : BehaviorExtensionElement

    public override Type BehaviorType
    
        get  return typeof(TrackingWebHttpBehavior); 
    

    protected override object CreateBehavior()
    
        return new TrackingWebHttpBehavior();
    

web.config:

<system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="queryString"
             type="namespace.TrackingBehaviorExtension, namespace"/>
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <queryString />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

但是,我仍然遇到同样的错误。我已经调试了服务初始化并且正在创建BehaviorExtensionElement,但从未调用过QueryStringConverter

是因为我使用的是standardEndpoint 配置而不是客户用户定义的端点吗?如果是这样,我如何将自定义行为附加到 standardEndpoint

【问题讨论】:

尝试使用数组而不是列表 @alex - 没有帮助,同样的错误消息(除了数组而不是列表) 为什么不定义一个服务元素并在您的端点元素中使用 webHttpBinding,然后将其与您编写的 TrackingBehavior 相关联。 【参考方案1】:

编辑

根据您正在开发的内容,您可能可以使用https://github.com/oyvindkinsey/easyXDM。 它允许在 x 域中进行 POST(使用 XHR)。


查询字符串是不是太多了?我认为如果只需要传递一个对象,查询字符串可以,但是列表......?也许我错了..但我认为你应该为每个请求只传递“一个”EventActionItem。

如果您负担得起更改,只需将列表(或数组)设置为主体参数,然后使用 POST 而不是 GET,或者像我上面建议的那样,对 EventActionItem 数组中的每个项目进行一次请求。

【讨论】:

这不是一个真正的答案,我在问题的第一行说它必须是 GET,因为这是 x-domain JSONP。 @EkoostikMartin:我说“如果你能负担得起更改......”,两天后,我仍然认为你不应该尝试序列化 System.Collections.Generic.List`1[ T] 用于查询字符串。在我看来,这不是 EventActionItem,而是 List。

以上是关于WCF REST - 使用复杂类型的“获取”的主要内容,如果未能解决你的问题,请参考以下文章

将复杂对象传递到 WCF Rest 服务

从 WCF Rest 客户端获取 HttpStatus

JSONPatch WCF REST API 获取无效负载错误

从 WCF 4 REST 模板获取调试输出

如何创建函数以从 WCF Rest 获取数据然后显示到表格

无法在 WCF Rest 中获取未定义或空引用的属性“appendChild”