2013-06-21 2 views
5

Я получаю доступ к веб-серверу, для которого требуется собственный протокол, а не http в URL-адресе. Я пытался зарегистрировать свой протокол, но документации о том, как это сделать, мало. Веб-сервер обслуживает стандартные HTTP-ответы, но если запрос не добавляется с помощью custom: // вместо http: //, он не будет работать. Я хотел бы просто использовать базовые функции WebRequest, так как это в конечном итоге HTTP, однако мне нужен способ отправить запрос с помощью моего собственного URL-адреса протокола. Я зарегистрировать его, как это:Регистрация пользовательского протокола с помощью WebRequest

WebRequest.RegisterPrefix("custom", new CustomWebRequestCreator()); 

Но тогда, когда я иду, чтобы создать WebRequest, в то время как он возвращает свой собственный класс, после этого кода:

Uri uri = new Uri("custom://192.168.0.122:94934/resource"); 
System.Net.WebRequest request = WebRequest.Create(uri); 

отладчик говорит, что запрос на самом деле мой пользовательский класс, но затем я получаю это исключение:

System.NotImplementedException was unhandled 
    HResult=-2147467263 
    Message=This method is not implemented by this class. 
    Source=System 
    StackTrace: 
     at System.Net.WebRequest.GetResponse() 
... 

Когда я пытаюсь просто передать мой URL в WebRequest.Create() без регистрации префикса, я получаю это исключение:

System.NotSupportedException was unhandled 
    HResult=-2146233067 
    Message=The URI prefix is not recognized. 
    Source=System 
    StackTrace: 
     at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase) 
     at System.Net.WebRequest.Create(Uri requestUri) 
    ... 

Любая идея, как я могу заставить это работать?

ответ

0

Это не кажется возможным или достигнет уровня сложности повторной реализации HTTP для WebRequest с нуля.

Я предлагаю вам вместо этого создать TCP-ретранслятор, с которым вы подключаетесь с помощью WebRequest [http://localhost/resource], чтобы он работал без попытки сглаживания WebRequest. В свою очередь, реле будет перенаправлено на сокет TCP 192.168.0.122:94934.

С помощью реле вы используете общий и упрощенный объект WebRequest. Если это приложение для консоли/веб-форм, реле может быть запущено в другом потоке (или может быть запущено асинхронно), когда приложение запущено.