[OperationContract][WebGet(ResponseFormat = Webmessageformat.Xml,UriTemplate = "SomeRequest?qs1={qs1}&qs2={qs2}")]XElement SomeRequest1(string qs1,string qs2);
现在,如果我们必须签署一个接受一个同名的参数的数组(在这种情况下是qs1),那么合同就是这样…
[OperationContract][WebGet(ResponseFormat = Webmessageformat.Xml,UriTemplate = "SomeRequest?qs1={qs1}&qs1={qs2}")] XElement SomeRequest2(string qs1,string qs2);
当我们对方法进行调用时,我们在运行时得到错误消息:
the query string must have ‘name=value’ pairs with unique names. Note that the names are case-insensitive. See the documentation for UriTemplate for more details.
如何定义使用参数数组暴露资源的http服务,而不使用loosey-goosey接口?
解决方法 我实现了一个简单的自定义queryStringConverter,以便您可以使qs1为字符串[],然后将查询字符串变量用逗号分隔(例如 http://server/service/SomeRequest?qs1=val1,val4)[OperationContract][WebGet(ResponseFormat = Webmessageformat.Xml,UriTemplate = "SomeRequest?qs1={qs1}")]XElement SomeRequest2(string[] qs1);
首先,您需要一个继承自WebhttpBehavior的类,以便我们可以注入我们的自定义queryStringConverter:
public class CustomhttpBehavior : System.ServiceModel.Description.WebhttpBehavior{ protected overrIDe System.ServiceModel.dispatcher.queryStringConverter GetqueryStringConverter(System.ServiceModel.Description.OperationDescription operationDescription) { return new CustomqueryStringConverter(); }}
然后我们的CustomqueryStringConverter处理string []参数:
public class CustomqueryStringConverter : System.ServiceModel.dispatcher.queryStringConverter{ public overrIDe bool CanConvert(Type type) { if (type == typeof(string[])) { return true; } return base.CanConvert(type); } public overrIDe object ConvertStringT@R_301_6631@ue(string parameter,Type parameterType) { if (parameterType == typeof(string[])) { string[] parms = parameter.Split(','); return parms; } return base.ConvertStringT@R_301_6631@ue(parameter,parameterType); } public overrIDe string ConvertValuetoString(object parameter,Type parameterType) { if (parameterType == typeof(string[])) { string valstring = string.Join(",",parameter as string[]); return valstring; } return base.ConvertValuetoString(parameter,parameterType); }}
您最后需要做的是创建行为配置扩展,以便运行时可以获取CustomWebhttpBehavior的实例:
public class CustomhttpBehaviorExtensionElement : System.ServiceModel.Configuration.BehaviorExtensionElement{ protected overrIDe object CreateBehavior() { return new CustomhttpBehavior(); } public overrIDe Type BehaviorType { get { return typeof(CustomhttpBehavior); } }}
现在我们将元素添加到配置扩展中,以便使用我们的CustomWebhttpBehavior,我们使用该扩展名,而不是< webhttp />在我们的行为:
<system.serviceModel> <services> <service name="nameSpace.ServiceClass"> <endpoint address="" behaviorConfiguration="MyServiceBehavior" binding="webhttpBinding" contract="nameSpace.ServiceClass" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="MyServiceBehavior"> <customWebhttp/> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="customWebhttp" type="nameSpace.CustomhttpBehaviorExtensionElement,MyAssemblyname" /> </behaviorExtensions> </extensions> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>
您现在还可以扩展您的CustomqueryStringConverter来处理其他类型的默认值,例如可空值类型.
注意:microsoft connect中存在与该代码直接相关的错误.在几乎所有情况下,您尝试查询转换不同类型的代码实际上不起作用.
http://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost#tabs
请确保您仔细阅读,浪费您的时间创建自定义REST查询字符串转换器的时间,无法工作. (适用于Framework 4.0及以下).
总结以上是内存溢出为你收集整理的在WCF Web编程模型中,如何用一组查询字符串参数(即同名)编写一个 *** 作契约?全部内容,希望文章能够帮你解决在WCF Web编程模型中,如何用一组查询字符串参数(即同名)编写一个 *** 作契约?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)