Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET本机应用程序等效于修改头Firefox插件_C#_.net_Proxy_Header_Tunneling - Fatal编程技术网

C# .NET本机应用程序等效于修改头Firefox插件

C# .NET本机应用程序等效于修改头Firefox插件,c#,.net,proxy,header,tunneling,C#,.net,Proxy,Header,Tunneling,我试图在c#中开发一个socks隧道应用程序,它能够通过使用添加和修改的头请求(类似于)打开网站,并通过代理(socks更好)隧道数据。请指定我可能需要的资源?或者任何可以执行相同功能的替代方案,或者我可以构建的开源软件,等等。谢谢 ps:应用程序还应该能够打开https和其他常见网络协议,一种方法是使用HttpSys并创建本地代理服务器来处理环回127.0.0.1地址上的请求。您需要将系统代理更改为此地址/端口,并位于客户端和服务器之间 这将允许您修改请求/响应数据包和头。这种方法在C#中有一

我试图在c#中开发一个socks隧道应用程序,它能够通过使用添加和修改的头请求(类似于)打开网站,并通过代理(socks更好)隧道数据。请指定我可能需要的资源?或者任何可以执行相同功能的替代方案,或者我可以构建的开源软件,等等。谢谢


ps:应用程序还应该能够打开https和其他常见网络协议,一种方法是使用
HttpSys
并创建本地代理服务器来处理环回
127.0.0.1
地址上的请求。您需要将系统代理更改为此地址/端口,并位于客户端和服务器之间

这将允许您修改请求/响应数据包和头。这种方法在C#中有一个简单的例子,我在下面对其进行了修改,以说明它是如何工作的

public class MyProxy
{
    private readonly HttpListener listener;

    public MyProxy()
    {
        listener = new HttpListener();
    }

    public void Start()
    {
        listener.Prefixes.Add("http://*:8888/");
        listener.Prefixes.Add("https://*:8889/");
        listener.Start();
        Console.WriteLine("Proxy started, hit enter to stop");
        listener.BeginGetContext(GetContextCallback, null);
        Console.ReadLine();
        listener.Stop();
    }

    public void GetContextCallback(IAsyncResult result)
    {
        var context = listener.EndGetContext(result);
        listener.BeginGetContext(GetContextCallback, null);

        var request = context.Request;
        var response = context.Response;
        var url = request.Url;

        UriBuilder builder = new UriBuilder(url);
        builder.Port = url.Port == 8888 ? 80 : 443;
        url = builder.Uri;

        WebRequest webRequest = WebRequest.Create(url);

        webRequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
        WebResponse webResponse = webRequest.GetResponse();
        using (Stream reader = webResponse.GetResponseStream())
        {
            using (Stream writer = response.OutputStream)
            {
                reader.CopyTo(writer);
            }
        }
    }
}
这种方法的缺点是它的级别很低,并且会影响用户机器上的所有流量,这可能是不可取的。您必须处理SSL请求,并且它还将影响任何现有配置的代理

另一种替代方法是使用
MicrosoftInternetControls
COM组件并扩展
WebBrowser
类。有一个这样的例子说明了方法。不幸的是,.NET命名空间中的
WebBrowser
版本没有实现请求-响应对象。下面是有趣的部分

public class ExtendedWebBrowser : WebBrowser
{
    ...

    void BeforeNavigate(object pDisp, ref object url, ref object flags,
                       ref object targetFrameName, ref object postData, 
                       ref object headers, ref bool cancel)
    {
         if (!headers.Contains("X-RequestFlag")
         {
             headers += "X-RequestFlag: true\r\n";

             // append custom header here

             // cancel current request
             cancel = true;

             // re-request with amended details
             Navigate((string)url, (string)targetFrameName, (byte[])postData, 
                      (string)headers);
         }
         else
         {
             base.BeforeNavigate(...);
         }
    }
}

非常感谢你写得很好的回答。实际上,我希望应用程序影响所有流量,但我不知道如何尝试ssl请求并通过同一个代理返回它。我希望有一些代码资源接近于此。您需要使用您自己的(自签名?)证书作为受信任的CA安装。这允许客户端向您的代理发出SSL请求,然后您可以解密,因为您知道私钥。然后像往常一样使用.NET WebRequest API通过SSL将请求发送到实际地址。我在Internet上查看了一个示例,但没有看到。你能帮我拿一个吗?感谢下面的示例演示了如何使用
SslStream
绑定到SSL并读取内容-这样您就可以使用本地SSL代理。当您请求真正的内容(在上下文请求中使用Url)时,您只需要像平常一样使用
WebRequest/WebResponse
对象,SSL就发生在幕后。任何问题都可能引发新问题。希望能有所帮助。实际上很抱歉,在使用
WebRequest
发出实际请求之前,您需要映射端口。e、 代理8888是端口80,8889是443。您还需要确保设置
webRequest.Proxy=GlobalProxySelection.GetEmptyWebProxy()