Win8(C#)中

时间:2015-10-07 18:13:15

标签: c# windows webclient

当我在Win8上运行它时,我在程序中遇到了一个问题(它在WinXP上运行正常)。如果有人能就一些事情发表意见,我将不胜感激。似乎WinXP和Win8之间的某些网络设置已经改变。

这里我制作的示例代码对我来说很奇怪:

HttpListener在本地侦听端口20000

static void Main(string[] args)
    {
        // Create listener
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://127.0.0.1:20000/");
        listener.Start();

        Console.WriteLine("Listening...");

        // Wait for request
        HttpListenerContext context = listener.GetContext();
        HttpListenerResponse response = context.Response;

        // Create response
        string responseString = GenerateString();
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64 = buffer.Length;

        // Send response 
        System.IO.Stream output = response.OutputStream;
        output.Write(buffer, 0, buffer.Length);
        output.Close();
        listener.Stop();

        Console.ReadLine();
    }

    private static string GenerateString()
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 6000000; i++)
        {
            sb.Append("A");
        }
        return sb.ToString();
    }

WebClient从端口20000下载字符串

static void Main(string[] args)
    {
        WebClient c = new WebClient();
        //c.Proxy = null;
            try
            {
                Console.WriteLine("Start downloading: {0}", DateTime.Now.ToString("hh:mm:ss.fff"));
                c.DownloadStringCompleted += (s,a) => OnDownloadStringCompleted(s,a);
                c.DownloadStringAsync(new Uri("http://127.0.0.1:20000"), c);
                //c.DownloadString(new Uri("http://127.0.0.1:20000"));
                //Console.WriteLine("Finish downloading: {0}", DateTime.Now.ToString("hh:mm:ss.fff"));
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }

        Console.ReadLine();

        c.Dispose();
    }

    private static void OnDownloadStringCompleted(object s, DownloadStringCompletedEventArgs arg)
    {
        try
        {
            string response = arg.Result;
            Console.WriteLine("Finish downloading: {0}", DateTime.Now.ToString("hh:mm:ss.fff"));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    } 

如果我在我的XP机器上运行它可以正常工作(WebClient异步下载字符串)。如果我在Win8机器上运行它(我尝试使用Win8和Win8.1的2台机器),那么它取决于我传递给HttpListenerResponse.OutputStream的字符串的大小 - 比如,对于100000个字符的小响应字符串,它工作正常,但对于6000000 chars它只在有时工作,有时会抛出错误:&#34;现有连接被远程主机强行关闭&#34;或&#34;无法建立连接,因为目标计算机主动拒绝它127.0.0.1:20000"。

另一个奇怪的事情是同步DownloadString(在那里注释)似乎在Win8上运行良好!

实际上,我有点迷茫,实在是太奇怪了。我不确定为什么它有时会起作用,但似乎它在我构建之后第一次起作用然后停止工作。

到目前为止我尝试过的事情: 1.禁用Windows防火墙 - 没有帮助 2.使用localhost&lt; - &gt; 127.0.0.1(Win8似乎更改了有关DNS的策略,因此localhost可能工作较慢或无法在不更改主机的情况下工作)。 127.0.0.1和localhost都以这种奇怪的方式工作。 3.从管理员和用户运行代码 - 也没有帮助。

有没有人经历过这件事,或者你有一些线索?

0 个答案:

没有答案