2016-06-14 3 views
0

Проблема: Как часть отладки проблемы, связанной с некоторыми вопросами проверки, я хотел бы прочитать 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 не активирован. Это как если бы пользовательская точка не была добавлена ​​в поведение конечной точки клиента. но как это может быть?

+0

У вас есть действующий endPoint? У вас есть запрос? Для работы кода вам необходимо инициализировать запрос с помощью HttpRequest или HttpWebRequest с помощью метода Create(). – jdweng

+0

Да, у меня есть и действительная конечная точка (другие методы на клиенте работают по назначению) и запрос. Я предполагаю, что вы ссылаетесь на переменную запроса в вызове метода клиента. –

+0

Вы пишите в тот же файл дважды. Вы хотите добавить данные? Мне интересно, сохраняете ли вы запрос вместо ответа. – jdweng

ответ

1

Вы можете настроить ведение журнала сообщений без изменения кода. Here's a link to documentation. Вы можете использовать SvcTraceViewer.exe для просмотра этого журнала

+0

Я пытался это сделать, но до сих пор мне не повезло. Я вижу действие, но не xml, связанное с отправленным запросом :( –

+0

Вы уверены, что нажимаете на трассировку сообщений? –

+0

Разумно уверен. Я получаю блок информации и блок сообщений. Когда я иду посмотреть XML я получаю ту же информацию, но, к сожалению, не сама requestdata –

 Смежные вопросы

  • Нет связанных вопросов^_^