C#UploadStringAsync无法正常工作

时间:2012-06-27 01:07:48

标签: wcf asynchronous webclient uploadstring

我正在使用wcf服务,我正在调用这样的方法:

public static void f5()
    {
        var client = new WebClient();
        client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
        var data = File.ReadAllText("request.xml");
        client.Headers.Add("Content-Type", "text/xml;charset=utf-8");
        client.Headers.Add("SOAPAction", "some string");            
        client.UploadStringAsync(new Uri("http://differentdomain/wcf/Service.svc"), data);
    }

    public static void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        Console.WriteLine(e.ToString());
        int cow = 0;
        cow++;
    }

    static void Main(string[] args)
    {
        f5();
    }

当我不使用异步方法时,这个程序工作得很好但是处理程序没有被调用因为某些原因。 Web服务托管在不同域上的不同计算机上,但客户端和服务器连接到同一网络。最重要的是,如果我使用的是UploadString,一切正常。

由于

2 个答案:

答案 0 :(得分:2)

您可以尝试使用非异步方法,但可以使用Task Parallel Library异步工作,而不是尝试使Async方法正常工作:

var client = new WebClient();
var data = File.ReadAllText("request.xml");
client.Headers.Add("Content-Type", "text/xml;charset=utf-8");
client.Headers.Add("SOAPAction", "some string");

Task.Factory.StartNew(() =>
{
    string returnVal = client.UploadString(new Uri("http://differentdomain/wcf/Service.svc"), data);
    Console.WriteLine(returnVal);
});

这是一个整体更好的策略,因为它适用于所有长时间运行的操作,而不仅仅是那些具有Async方法和事件处理程序的操作。

它还应该使发生的任何通信/传输错误更容易被捕获。

答案 1 :(得分:1)

您的程序在调用UploadStringAsync后立即退出,因此没有时间来获取响应。在下面的代码中,如果我在Main方法的末尾删除Thread.Sleep调用,它也不会打印任何内容。尝试等待响应在退出程序之前到达。

public class StackOverflow_11218045
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
    }
    public class Service : ITest
    {
        public string Echo(string text)
        {
            return text;
        }
    }
    public static void Main()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
        host.Open();
        Console.WriteLine("Host opened");

        string data = @"<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">
                            <s:Header/>
                            <s:Body>
                                <Echo xmlns=""http://tempuri.org/"">
                                    <text>Hello</text>
                                </Echo>
                            </s:Body>
                        </s:Envelope>";
        var client = new WebClient();
        client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
        client.Headers[HttpRequestHeader.ContentType] = "text/xml; charset=utf-8";
        client.Headers.Add("SOAPAction", "http://tempuri.org/ITest/Echo");

        ManualResetEvent evt = new ManualResetEvent(false);
        client.UploadStringAsync(new Uri(baseAddress), "POST", data, evt);
        evt.WaitOne();
    }

    static void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        Console.WriteLine(e.Result);
        ((ManualResetEvent)e.UserState).Set();
    }
}