Как зарегистрировать необработанный запрос в службе WCF

У меня есть служба 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?

11
задан Maloric 23 April 2012 в 10:15
поделиться