我正在使用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,一切正常。
由于
答案 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();
}
}