Проблема: Как часть отладки проблемы, связанной с некоторыми вопросами проверки, я хотел бы прочитать XML-запрос веб-службы WCF.Как получить запрос перед вызовом webservice
По-видимому, это сложнее, чем кажется, и любая помощь в этом отношении была бы высоко оценена. Ниже я уже пробовал. Очень похоже на ответ на аналогичный вопрос здесь, на StackOverflow (link).
Мое решение: Я создал клиента, устанавливающего конечную точку, предоставленную поставщиком веб-сервиса. Я добавил учетные данные моего клиента как поведение конечной точки. Прямо перед тем, как я позвоню в службу, я добавляю еще одно поведение конечной точки, чтобы написать запрос и ответ в виде XML-файлов. Увы, безрезультатно.
Простой вызов WebService:
public SaveAvailabilityAssessmentResponseType SaveAvailabilityAssessment(SaveAvailabilityAssessmentRequestType request)
{
Client.Endpoint.Behaviors.Add(new CustomEndpointBehavior());
return Client.SaveAvailabilityAssessment(_ocesCertHeader, _activeOrganisationHeader, request);
}
А вот класс CustomEndpointBehavior (немного упрощен):
public class CustomEndpointBehavior : IEndpointBehavior
{
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(new MessageExpector());
}
}
А вот класс MessageExpector:
internal class MessageExpector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
using (var sw = new StreamWriter(@"C:\temp\response.xml"))
{
sw.WriteLine(reply);
}
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
using (var sw = new StreamWriter(@"C:\temp\request.xml"))
{
sw.WriteLine(request);
}
return new object();
}
}
Может ли кто-нибудь сказать мне, что мне не хватает?
Редактировать: Дальнейшая отладка показала, что код в CustomEndpointBehavior не активирован. Это как если бы пользовательская точка не была добавлена в поведение конечной точки клиента. но как это может быть?
У вас есть действующий endPoint? У вас есть запрос? Для работы кода вам необходимо инициализировать запрос с помощью HttpRequest или HttpWebRequest с помощью метода Create(). – jdweng
Да, у меня есть и действительная конечная точка (другие методы на клиенте работают по назначению) и запрос. Я предполагаю, что вы ссылаетесь на переменную запроса в вызове метода клиента. –
Вы пишите в тот же файл дважды. Вы хотите добавить данные? Мне интересно, сохраняете ли вы запрос вместо ответа. – jdweng