1

仕事の一部として利用する必要がある ASMX Web サービスがあります。ASPX ページ経由でこのサービスを呼び出して、サード パーティ システムで新しいエンティティを作成しています。そのサービスの基盤となるコードにはアクセスできません。単に別のシステムと通信できるようにするためです。

サービスを正しく呼び出しているかどうかを判断するのに苦労しています。誰かアドバイスをいただけないでしょうか。

ASMX ページをインストールしました。これにより、BeginProcessOperations メソッドと呼ばれるクラス「ConfirmConnector」が提供されました。それが戻ってくるのを待ってから、結果を解析したいと思います。結果は XML である必要があり、それをステップスルーして目的のデータを取得します。

問題は、このプロセスが時々死んでしまうことです。つまり、「EndProcessOperations」メソッドを呼び出しても何も起こりません。エラーは発生しません。コードが終了し、メソッドが返されます。

私の呼び出しコードは次のとおりです。

private void sendConfirmRequest(XmlManipulator requestXML)
{
    file.WriteLine("Sending CONFIRM Request!");
    AsyncCallback callBack = new AsyncCallback(processConfirmXML); // assign the callback method for this call

    IAsyncResult r = conn.BeginProcessOperations(requestXML, callBack, AsyncState);
    System.Threading.WaitHandle[] waitHandle = { r.AsyncWaitHandle }; // set up a wait handle so that the process doesnt automatically return to the ASPX page
    System.Threading.WaitHandle.WaitAll(waitHandle, -1);
}

私のハンドラーコードは次のとおりです。

 /*
 * Process the response XML from the CONFIRM Connector
 */
private static void processConfirmXML(IAsyncResult result)
{
    try
    {
        file.WriteLine("Received Response from CONFIRM!");
        if(result == null)
        {
            file.WriteLine("RESPONSE is null!!");
        }
        if(conn == null)
        {
            file.WriteLine("conn is null!!");
        }
        file.WriteLine("Is Completed : " + result.IsCompleted);

        XmlNode root =  conn.EndProcessOperations(result);
        file.WriteLine("got return XML");
        //writeXMLToFile("C:/response.xml",root.InnerXml);
        file.WriteLine(root.InnerXml);

このコードを正しい方法で処理しているかどうか誰でもアドバイスできますか?また、ハンドラーのこの行の後に私のコードがランダムに爆撃する理由を誰か知っていますか?

XmlNode root =  conn.EndProcessOperations(result);

助けてくれてありがとう、ポール

4

1 に答える 1

0

ご覧いただきありがとうございますが、問題は解決しました。この問題は、コールバック操作に関連しているようです。

同じコード ブロックで begin メソッドと end メソッドを呼び出すようにコードを変更しましたが、それ以来問題は発生していません。

private void sendConfirmRequest(XmlManipulator requestXML)
{
    //ConfirmConnector conn = new ConfirmConnector();
    file.WriteLine("Sending CONFIRM Request!");
    //AsyncCallback callBack = new AsyncCallback(processConfirmXML); // assign the callback method for this call

    //IAsyncResult r = conn.BeginProcessOperations(requestXML, callBack, AsyncState);
    //System.Threading.WaitHandle[] waitHandle = { r.AsyncWaitHandle }; // set up a wait handle so that the process doesnt automatically return to the ASPX page
    //System.Threading.WaitHandle.WaitAll(waitHandle, -1);

    file.WriteLine("Calling BeginProcessOperations");
    IAsyncResult result = conn.BeginProcessOperations(requestXML, null, null);
    // Wait for the WaitHandle to become signaled.
    result.AsyncWaitHandle.WaitOne();
    file.WriteLine("Calling EndProcessOperations");
    XmlNode root = conn.EndProcessOperations(result);
    processConfirmXML(root);

    file.WriteLine("got return XML");
    //writeXMLToFile("C:/response.xml",root.InnerXml);
    file.WriteLine(root.InnerXml);

    // Close the wait handle.
    result.AsyncWaitHandle.Close();
}

ありがとう

ポール

于 2012-11-12T19:59:02.067 に答える