Her WCF çağrısına nesne yönelimli şekilde özel HTTP üstbilgileri eklemek istiyorsanız, daha fazla kendinizi yormayın.
Mark Good ve paulwhit'in cevabında olduğu gibi, IClientMessageInspectorözel HTTP başlıklarını WCF isteğine enjekte etmek için alt sınıfa ihtiyacımız var . Ancak, eklemek istediğimiz başlıkları içeren bir sözlüğü kabul ederek denetçiyi daha genel hale getirelim:
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 ...
}
Mark Good'un ve paulwhit'in cevabında olduğu gibi, WCF müşterimize IEndpointBehaviorenjekte etmek için alt sınıfa ihtiyacımız var 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 ...
}
Nesneye yönelik yaklaşımımızı tamamlamak için gereken son bölüm, WCF otomatik olarak oluşturulan istemcimizin bir alt sınıfını oluşturmaktır (Microsoft'un WCF Web Hizmeti Başvuru Kılavuzu'nu kullandım) WCF istemcisi oluşturmak için kullandım).
Benim durumumda, bir API anahtarı x-api-key HTML başlığına .
Alt sınıf aşağıdakileri yapar:
- temel sınıfın yapıcısını gerekli parametrelerle çağırır (benim durumumda bir
EndpointConfiguration yapıcıya geçmek için numaralandırma oluşturuldu - belki uygulamanız buna sahip olmayacaktır)
- Her talebe eklenmesi gereken başlıkları tanımlar
AddHttpHeaderMessageEndpointBehaviorİstemcinin Endpointdavranışlarına iliştirilir
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);
}
}
Son olarak, müşterinizi kullanın!
var apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
var client = new Client (apiKey);
var result = client.SomeRequest()
Ortaya çıkan HTTP isteği HTTP başlıklarınızı içermeli ve şöyle görünmelidir:
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>