WebClient UploadValues连接意外关闭

时间:2017-07-15 06:53:55

标签: c# webclient

我在尝试将发布数据发送到我的php服务器时遇到错误。 此调用适用于我的程序中的一个位置,但不适用于第二个。

我的PHP代码只是一个简单的回声,我已经测试了该页面,它运行正常。

  

抛出异常:' System.Net.WebException'在System.dll中   底层连接已关闭:连接已关闭   出乎意料。

public static class NetworkDeploy 
{
    public delegate void CallBack(string response);

    public static void SendPacket(string url, CallBack callback) 
    {
        SynchronizationContext callersCtx = SynchronizationContext.Current;
        Thread thread = new Thread(() =>
        {
            using (var client = new WebClient())
            {
                NameValueCollection values = new NameValueCollection();
                values["test"] = "test";
                // exception occurs at the next line
                byte[] uploadResponse = client.UploadValues(url, "POST", values);
                string response = Encoding.UTF8.GetString(uploadResponse);
                if (callback != null) callersCtx.Post(new SendOrPostCallback((_) => callback.Invoke(response)), null);
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
    }
}

我尝试将异常行放在for循环中,如下所示:

byte[] uploadResponse = null;
for (int i=0; i<10; i++)
{
    try
    {
        // exception occurs at the next line
        uploadResponse = client.UploadValues(url, "POST", values);
        break;
    } catch (Exception e) { }
}

并且php代码只是

<?php
echo "Success";

1 个答案:

答案 0 :(得分:0)

我怀疑问题来自于使用SynchronizationContext.Current以及如何调用委托来回调您的主UI线程。

我已经编写了一个示例概念验证,使用任务工厂和匿名委托来执行此操作,这些委托应该允许您从UI线程调用任务,然后在UI线程上处理完成的结果。

我希望这能解决问题:

    Task<string> SendPacket(string url)
    {
        return Task<string>.Factory.StartNew(() =>
        {
            using (var client = new WebClient())
            {
                NameValueCollection values = new NameValueCollection();
                values["test"] = "test";
                // exception occurs at the next line
                byte[] uploadResponse = client.UploadValues(url, "POST", values);
                return Encoding.UTF8.GetString(uploadResponse);
            }
        });
    }

    void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            SendPacket("http://localhost:8733/api/values").ContinueWith(task => DoSomethingOnCallback(task.Result));
        }
    }

    void DoSomethingOnCallback(string response)
    {
        Console.WriteLine(response);
    }