আপনি যদি কোনও অবজেক্ট ভিত্তিক উপায়ে প্রতিটি ডাব্লুসিএফ কলটিতে কাস্টম এইচটিটিপি শিরোনাম যুক্ত করতে চান তবে আর দেখার দরকার নেই।
মার্ক গুডস এবং পলভাইটের উত্তরের মতোই IClientMessageInspectorআমাদের ডাব্লুসিএফ অনুরোধে কাস্টম এইচটিটিপি শিরোনাম ইনজেক্ট করার জন্য সাবক্লাস প্রয়োজন । তবে, আমরা যে শিরোনাম যুক্ত করতে চাই সেগুলি সহ একটি অভিধান গ্রহণ করে পরিদর্শকটিকে আরও জেনেরিক করে তুলি:
public class HttpHeaderMessageInspector : IClientMessageInspector
{
private Dictionary<string, string> Headers;
public HttpHeaderMessageInspector(Dictionary<string, string> headers)
{
Headers = headers;
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
// ensure the request header collection exists
if (request.Properties.Count == 0 || request.Properties[HttpRequestMessageProperty.Name] == null)
{
request.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty());
}
// get the request header collection from the request
var HeadersCollection = ((HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]).Headers;
// add our headers
foreach (var header in Headers) HeadersCollection[header.Key] = header.Value;
return null;
}
// ... other unused interface methods removed for brevity ...
}
মার্ক গুডস এবং পলভাইটের উত্তরের মতোই IEndpointBehaviorআমাদের HttpHeaderMessageInspectorআমাদের ডাব্লুসিএফ ক্লায়েন্টে ইনজেকশন দেওয়ার জন্য সাবক্লাস প্রয়োজন ।
public class AddHttpHeaderMessageEndpointBehavior : IEndpointBehavior
{
private IClientMessageInspector HttpHeaderMessageInspector;
public AddHttpHeaderMessageEndpointBehavior(Dictionary<string, string> headers)
{
HttpHeaderMessageInspector = new HttpHeaderMessageInspector(headers);
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(HttpHeaderMessageInspector);
}
// ... other unused interface methods removed for brevity ...
}
আমাদের অবজেক্ট অরিয়েন্টেড পদ্ধতির সমাপ্তির জন্য শেষ অংশটি হ'ল আমাদের ডাব্লুসিএফ অটো-জেনারেট ক্লায়েন্টের একটি সাবক্লাস তৈরি করা (আমি ডাব্লুসিএফ ক্লায়েন্ট তৈরির জন্য মাইক্রোসফ্টের ডাব্লুসিএফ ওয়েব পরিষেবা রেফারেন্স গাইড ব্যবহার করেছি )।
আমার ক্ষেত্রে, আমাকে x-api-keyএইচটিএমএল শিরোনামের সাথে একটি এপিআই কী সংযুক্ত করতে হবে ।
সাবক্লাসটি নিম্নলিখিতগুলি করে:
- বেস বর্গের কনস্ট্রাক্টরকে প্রয়োজনীয় প্যারামিটারগুলি কল করে (আমার ক্ষেত্রে
EndpointConfigurationকনস্ট্রাক্টরে প্রবেশের জন্য একটি এনাম তৈরি হয়েছিল - সম্ভবত আপনার বাস্তবায়নে এটি থাকবে না)
- শিরোনামগুলি সংজ্ঞায়িত করে যা প্রতিটি অনুরোধের সাথে সংযুক্ত করা উচিত
- সংযুক্ত
AddHttpHeaderMessageEndpointBehaviorক্লায়েন্টের কাছে Endpointআচরণে
public class Client : MySoapClient
{
public Client(string apiKey) : base(EndpointConfiguration.SomeConfiguration)
{
var headers = new Dictionary<string, string>
{
["x-api-key"] = apiKey
};
var behaviour = new AddHttpHeaderMessageEndpointBehavior(headers);
Endpoint.EndpointBehaviors.Add(behaviour);
}
}
অবশেষে, আপনার ক্লায়েন্ট ব্যবহার করুন!
var apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
var client = new Client (apiKey);
var result = client.SomeRequest()
ফলাফলের এইচটিটিপি অনুরোধে আপনার এইচটিটিপি শিরোনাম থাকা উচিত এবং এর মতো কিছু দেখতে হবে:
POST http://localhost:8888/api/soap HTTP/1.1
Cache-Control: no-cache, max-age=0
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8
Accept-Encoding: gzip, deflate
x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXX
SOAPAction: "http://localhost:8888/api/ISoapService/SomeRequest"
Content-Length: 144
Host: localhost:8888
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<SomeRequestxmlns="http://localhost:8888/api/"/>
</s:Body>
</s:Envelope>