Jika Anda ingin menambahkan header HTTP khusus ke setiap panggilan WCF dengan cara yang berorientasi objek, tidak perlu mencari lagi.
Sama seperti dalam jawaban Mark Good dan paulwhit, kita perlu subkelas IClientMessageInspector
untuk menyuntikkan header HTTP khusus ke dalam permintaan WCF. Namun, mari buat inspektur lebih umum dengan menerima kamus yang berisi tajuk yang ingin kita tambahkan:
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 ...
}
Sama seperti dalam jawaban Mark Good dan paulwhit, kita perlu subkelas IEndpointBehavior
untuk menyuntikkan HttpHeaderMessageInspector
klien kami ke WCF kami.
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 ...
}
Bagian terakhir yang diperlukan untuk menyelesaikan pendekatan berorientasi objek kami, adalah membuat subkelas dari klien yang dibuat secara otomatis WCF kami (saya menggunakan Panduan Referensi Layanan Web WCF Microsoft untuk menghasilkan klien WCF).
Dalam kasus saya, saya perlu melampirkan kunci API ke x-api-key
header HTML.
Subclass melakukan hal berikut:
- memanggil konstruktor dari kelas dasar dengan parameter yang diperlukan (dalam kasus saya
EndpointConfiguration
enum dihasilkan untuk masuk ke konstruktor - mungkin implementasi Anda tidak akan memiliki ini)
- Menentukan header yang harus dilampirkan ke setiap permintaan
- Menempel perilaku
AddHttpHeaderMessageEndpointBehavior
klienEndpoint
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);
}
}
Akhirnya, gunakan klien Anda!
var apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
var client = new Client (apiKey);
var result = client.SomeRequest()
Permintaan HTTP yang dihasilkan harus berisi tajuk HTTP Anda dan terlihat seperti ini:
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>