Nếu bạn muốn thêm các tiêu đề HTTP tùy chỉnh vào mỗi cuộc gọi WCF theo cách hướng đối tượng, không tìm đâu xa.
Giống như trong câu trả lời của Mark Good và paulwhit, chúng ta cần phân lớp IClientMessageInspector
để đưa các tiêu đề HTTP tùy chỉnh vào yêu cầu WCF. Tuy nhiên, hãy làm cho trình kiểm tra chung chung hơn bằng cách chấp nhận một từ điển có chứa các tiêu đề mà chúng tôi muốn thêm:
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 ...
}
Giống như trong câu trả lời của Mark Good và paulwhit, chúng ta cần phải phân lớp IEndpointBehavior
để đưa chúng ta HttpHeaderMessageInspector
vào ứng dụng khách WCF.
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 ...
}
Phần cuối cùng cần thiết để hoàn thành cách tiếp cận hướng đối tượng của chúng tôi, là tạo một lớp con của ứng dụng khách được tạo tự động WCF của chúng tôi (Tôi đã sử dụng Hướng dẫn tham khảo dịch vụ web WCF của Microsoft để tạo ứng dụng khách WCF).
Trong trường hợp của tôi, tôi cần đính kèm khóa API vào x-api-key
tiêu đề HTML.
Lớp con thực hiện như sau:
- gọi hàm tạo của lớp cơ sở với các tham số cần thiết (trong trường hợp của tôi là
EndpointConfiguration
enum được tạo để truyền vào hàm tạo - có thể việc triển khai của bạn sẽ không có điều này)
- Xác định các tiêu đề nên được đính kèm với mọi yêu cầu
- Gắn liền
AddHttpHeaderMessageEndpointBehavior
với Endpoint
hành vi của khách hàng
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);
}
}
Cuối cùng, sử dụng khách hàng của bạn!
var apiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXX';
var client = new Client (apiKey);
var result = client.SomeRequest()
Yêu cầu HTTP kết quả phải chứa các tiêu đề HTTP của bạn và trông giống như thế này:
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>