在WCF Web编程模型中,如何用一组查询字符串参数(即同名)编写一个 *** 作契约?

在WCF Web编程模型中,如何用一组查询字符串参数(即同名)编写一个 *** 作契约?,第1张

概述使用WCF Web编程模型可以指定如下 *** 作契约: [OperationContract][WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}&qs2={qs2}")]XElement SomeRequest1(string qs1, string qs2); 现在,如果我们必须签署 使用WCF Web编程模型可以指定如下 *** 作契约:
[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编程模型中,如何用一组查询字符串参数(即同名)编写一个 *** 作契约?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1089905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存