向WebRequest注册自定义协议

本文关键字:协议 自定义 注册 WebRequest | 更新日期: 2023-09-27 18:19:31

我访问的web服务器需要自定义协议,而不是url中的http。我已经尝试注册我的协议,但没有太多关于如何使其发挥作用的文档。web服务器提供标准的HTTP响应,但如果请求前没有用custom://而不是HTTP://,它将无法工作。我只想按原样使用WebRequest底层功能,因为这最终是HTTP,但是,我需要一种使用自定义协议url提交请求的方法。我是这样注册的:

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

你知道我该怎么做吗?

向WebRequest注册自定义协议

这似乎不可能,或者可能达到从头开始为WebRequest重新实现HTTP的复杂程度。

我建议您创建一个TCP中继,使用WebRequest连接到它[http://localhost/resource],以便在不试图扭曲WebRequest的情况下使其工作。中继将依次转发到TCP套接字192.168.0.122:94934。

对于中继,您可以使用通用且简化的WebRequest对象。如果是针对控制台/webforms应用程序,则当应用程序启动时,中继可以在另一个线程上启动(也可以异步启动)。