У меня есть служба WCF с несколькими методами. Я хотел бы регистрировать необработанный запрос, пришедший от клиента, независимо от того, как он был отправлен. Один метод принимает данные в виде строки запроса (строго для устаревшей поддержки), которую я могу регистрировать, используя:
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
Этого достаточно в этом сценарии, но другие методы позволяют клиенту отправлять данные в виде XML с использованием прокси-класса, созданного svcutil.exe В этом сценарии Я нашел нужные мне данные в s:Body of:
OperationContext.Current.RequestContext.RequestMessage
К сожалению, как бы я ни пытался, я не могу создать буферизованную копию сообщения до того, как оно будет прочитано. Вот пример:
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
На Первая строка SendCustomer, однако, я получаю следующую ошибку:
Это сообщение не может поддерживать операцию, потому что оно было прочитано.
В этом смысл создания буферизованной копии, верно? Я предполагаю, что я Я делаю здесь что-то элементарно неправильно
Редактировать:
Итак, метод теперь такой:
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
Моя проблема в том, что я не знаю, как отправить Customer и ClientKey как отдельные сущности. Я мог бы сделать clientKey свойством Customer (или создать пользовательский объект, специально предназначенный для передачи данных и содержащий Customer и ClientKey в качестве атрибутов), но я хотел бы избежать этого, если это возможно, поскольку это обновление устаревшей системы, которая уже так работает.
У меня также возникают проблемы с использованием svcUtil.exe для создания моих прокси-классов — я предполагаю, что наличие вышеуказанной подписи метода означает, что моя служба больше не будет рекламировать правильную подпись для отправки запросов как? Не уверен, что это достаточно ясно - если мой единственный метод ввода принимает объект Message, как мой клиент узнает, что нужно отправить Customer и ClientKey?