c# - WCF REST - "Get"使用复杂类型

标签 c# wcf wcf-rest

我有一个 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();
    }
}

网络配置:

<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

最佳答案

编辑

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


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

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

关于c# - WCF REST - "Get"使用复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436669/

相关文章:

c# - 为什么 ASP.Net MVC 模型绑定(bind)器将空 JSON 数组绑定(bind)到 null?

c# - WCF 客户端正在使用流式传输模式进行缓冲

wcf - wcf Restful 服务的命名空间问题

c# - 使用 Ninject 查找实现通用接口(interface)的类

c# - 在 WCF 服务和客户端中使用程序集中的接口(interface)和类

c# - 多目标 .net core 2.2 和 .net 4.6.1

c# - WCF Restful Web 服务客户端限制

.net - 为 Rest Web 服务创建 WCF 代理

c# - 使用 Windows 服务和 SQL Server 在单向 WCF 消息中排队

c# - Process.Start cmd.exe 不会运行在 IIS 中运行时作为参数传递的 cmd 文件