1

私は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を使用すると、最も重要なことはすべて正常に機能します。

ありがとう

4

2 に答える 2

2

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メソッドとイベントハンドラーを持つ操作だけでなく、すべての長時間実行操作で機能するため、全体的に優れた戦略です。

また、発生する通信/トランスポートエラーを見つけやすくする必要があります。

于 2012-06-27T04:51:19.693 に答える
1

UploadStringAsyncを呼び出した直後にプログラムが終了しているため、応答を取得する時間がありません。Thread.Sleep以下のコードでは、Mainメソッドの最後で呼び出しを削除すると、何も出力されません。プログラムを終了する前に、応答が到着するのを待ってみてください。

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();
    }
}
于 2012-06-27T15:59:32.010 に答える