WCF REST-“;获取";使用复杂类型
本文关键字:复杂 类型 quot REST- 获取 WCF | 更新日期: 2023-09-27 18:20:44
我有一个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
?
编辑
根据您正在开发的内容,您可能可以使用https://github.com/oyvindkinsey/easyXDM.
它允许在x域中POST(使用XHR)。
对于一个查询字符串来说不是太多了吗?我认为,如果只需要传递一个对象,那么对于查询字符串,可以吗,但对于列表。。。?也许我错了。。但我认为您应该为每个请求只传递"一个"EventActionItem。
如果您能负担得起这些更改,只需将列表(或数组)作为一个主体参数,然后使用POST而不是GET,或者像我上面建议的那样,为EventActionItem数组中的每个项目一个请求。