Сериализация объектов WCF HttpWebResponse в интерфейсе / контракте - PullRequest
2 голосов
/ 10 марта 2011

Я почти закончил со службой WCF, которая позволяет мне «удаленно» обращаться к базе данных. Одним из пунктов нашего контракта является возможность удаленного HTTP-запроса.

Вот интерфейс:

[Operation_Contract()]
bool DoWebRequest( string url, out HttpWebResponse resp );

with the implementation (more or less -- no error reporting here):

public bool DoWebRequest( string url, out HttpResponse resp )
{
   bool done = false;
   resp = null;

   WebRequest req = WebRequest.Create( url );
   resp.Credentials = CredentialCache.DefaultCredentials;
   resp = (HttpWebResponse )req.GetResponse();
   done = ( resp != null ? true : false );

   return done;
}

Затем я обертываю это в WCFServiceLibrary, размещаю в консольном приложении, создаю ссылку на службу в другом приложении с клиентом. Затем я оборачиваю клиента в другой класс и вызываю его через client.DoWebRequest (url, out resp);

И все мои вещи для доступа к данным работают. Однако, когда я пытаюсь использовать его в тестовом приложении, я получаю следующее:

Соединение с сокетом было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса. Тайм-аут локального сокета был '00: 00: 59.7180000 '.

Я предполагаю, что это исключение связано с тем фактом, что я неправильно сериализовал объект HttpWebResponse в моем определении интерфейса. Хотя я могу ошибаться. Буду признателен за помощь в том, как заставить это работать.

В качестве примечания, когда я создаю ссылку на сервис, она переключает мои параметры. Клиентский файл Reference.cs показывает метод следующим образом:

public bool DoWebRequest( out HttpWebResponse resp, string url )
{  
   return base.Channel.DoWebRequest( out resp, url );
}

Есть идеи, почему? Это единственный метод с переключаемыми параметрами. Может ли это быть частью проблемы? Я не могу понять, почему инструмент сделал бы это.

Еще раз спасибо.

1 Ответ

2 голосов
/ 10 марта 2011

Объект HttpWebResponse, без сомнения, содержит информацию, которая действительна только на той машине, с которой он поступает, например, сетевой поток, обслуживающий запрос.Эта информация не имеет смысла сериализовать.

Вы должны абстрагироваться от того, что вы подразумеваете под веб-запросом и веб-ответом, и создавать объекты, соответствующие этим абстракциям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...