Tôi đã thực hiện một QueryStringConverter tùy chỉnh đơn giản để bạn có thể làm cho qs1 một string [] sau đó có biến chuỗi truy vấn có dấu phẩy phân cách (ví dụ http://server/service/SomeRequest?qs1=val1,val2,val3,val4)
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "SomeRequest?qs1={qs1}")]
XElement SomeRequest2(string[] qs1);
Trước tiên, bạn cần một lớp kế thừa từ WebHttpBehavior để chúng tôi có thể tiêm QueryStringConverter tùy chỉnh của chúng tôi:
public class CustomHttpBehavior : System.ServiceModel.Description.WebHttpBehavior
{
protected override System.ServiceModel.Dispatcher.QueryStringConverter GetQueryStringConverter(System.ServiceModel.Description.OperationDescription operationDescription)
{
return new CustomQueryStringConverter();
}
}
Sau đó CustomQueryStringConverter của chúng tôi để xử lý string [] thông số:
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 ConvertStringToValue(string parameter, Type parameterType)
{
if (parameterType == typeof(string[]))
{
string[] parms = parameter.Split(',');
return parms;
}
return base.ConvertStringToValue(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);
}
}
Điều cuối cùng bạn cần làm là tạo tiện ích cấu hình hành vi để mà bộ thực thi có thể nhận được một thể hiện của các CustomWebHttpBehavior:
public class CustomHttpBehaviorExtensionElement : System.ServiceModel.Configuration.BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new CustomHttpBehavior();
}
public override Type BehaviorType
{
get { return typeof(CustomHttpBehavior); }
}
}
Bây giờ chúng ta thêm yếu tố để mở rộng cấu hình của chúng tôi để CustomWebHttpBehavior của chúng tôi được sử dụng, chúng tôi sử dụng tên của phần mở rộng thay vì <webHttp />
trong hành vi của chúng tôi:
<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>
Bây giờ bạn cũng có thể mở rộng CustomQueryStringConverter của bạn để xử lý các loại khác mà mặc định trên e không, chẳng hạn như các loại giá trị nullable.
LƯU Ý: Có lỗi được ghi lại ở kết nối microsoft có liên quan trực tiếp đến mã này. Mã này không thực sự hoạt động trong hầu hết các trường hợp mà bạn cố gắng truy vấn Chuyển đổi các loại khác nhau.
http://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost#tabs
Hãy chắc chắn rằng bạn đọc cẩn thận trước khi lãng phí thời giờ của bạn tạo tùy chỉnh REST của chuỗi truy vấn chuyển đổi mà không thể nào làm việc. (Áp dụng cho Framework 4.0 trở xuống).
Bất kỳ ý tưởng nào về cách chúng tôi có thể có giao diện như vậy: http: // server/service/SomeRequest? Qs1 = val1 & qs1 = val2 & qs1 = val3 & qs1 = val4? Chúng tôi có thể ofcourse hack nó để trả về một chuỗi định dạng với tên tham số thay vì dấu phẩy. –
Tuyệt vời! Tôi chạy vào một vấn đề mà phần mở rộng hành vi của tôi sẽ không tải trừ khi tôi hoàn toàn đủ điều kiện tên loại với phiên bản lắp ráp, chìa khóa, vv Xem http://nayyeri.net/configuration-error-for-custom-behavior-extensions-in -wcf –
Có một lỗi trong WCF 4 với WebServiceHost không gọi phương thức GetQueryStringConverter bị ghi đè. Xem https://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost?wa=wsignin1.0 – Daniel