2013-06-21 39 views
5

Uzyskuję dostęp do serwera WWW wymagającego niestandardowego protokołu zamiast adresu http w adresie URL. Próbowałem zarejestrować mój protokół, ale nie ma zbyt wiele dokumentacji, jak to zrobić. Serwer WWW obsługuje standardowe odpowiedzi HTTP, ale jeśli żądanie nie jest poprzedzone niestandardowym: // zamiast http: //, nie będzie działać. Chciałbym po prostu użyć podstawowej funkcji WebRequest, ponieważ jest to ostatecznie HTTP, jednak potrzebuję sposobu na przesłanie żądania z moim niestandardowym adresem URL protokołu. I zarejestrować go tak:Zarejestruj protokół niestandardowy za pomocą składnika WebRequest

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

Ale wtedy, kiedy idę do stworzenia WebRequest, natomiast zwraca moją niestandardową klasę po tym kodzie:

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

Debuger mówi, że wniosek jest rzeczywiście moim niestandardowy klasy, ale następnie otrzymuję ten wyjątek:

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

Kiedy próbuję tylko przekazać mój adres URL do WebRequest.Create() bez rejestracji prefiks, otrzymuję ten wyjątek:

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) 
    ... 

Masz pomysł, jak to osiągnąć?

Odpowiedz

0

To nie wydaje się możliwe, lub osiągnęłoby poziom złożoności ponownego wdrażania HTTP dla WebRequest od zera.

Proponuję zamiast tego utworzyć przekaźnik TCP, z którym łączysz się przy użyciu WebRequest [http://localhost/resource], aby działał bez próby naruszenia połączenia z WebRequest. Przekaźnik będzie z kolei przekazywany do gniazda TCP 192.168.0.122:94934.

Używając przekaźnika, używasz wspólnego i uproszczonego obiektu WebRequest. Jeśli jest to aplikacja konsolowa/internetowa, przekaźnik może zostać uruchomiony na innym wątku (lub może zostać uruchomiony asynchronicznie) po uruchomieniu aplikacji.