我在尝试将发布数据发送到我的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";
答案 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);
}