0

私はこれを正しく設定したと信じています。誰かがこのコードに問題があることを確認できますか? IAsyncResult asyncResult1 を実行してから、すぐに IAsyncResult asyncResult2 に移動する必要がありますか? 動作は、asyncResult1 を呼び出す (ExecuteAsyncRequest を呼び出す) ことで、残りのサービスはそれを少し保持してから返し、次のサービスが呼び出されます。BeginGetResponse だけで次の呼び出しに進むべきではありませんか?

WCF Rest Service Web メソッドは次のとおりです。

 public Stream CheckOutForMaster(Stream clientServerXmlStream)
    {
       //Logic 1: Checks if it's between a set 30 second window.
       //Logic 2: Processes more logic
       //Logic 3: Holding pattern until the 30 second window is complete. Thus allowing multiple calls to be made via other connections.
       //Logic 4: Once 30 second window is complete. All connections have saved their  data to a database and each connection will retrieve all data from all connects.
    }

クライアント側のテスト コード:

[TestClass]
public class sccTests
{
    public static ManualResetEvent allDone = new ManualResetEvent(false);
    const int BUFFER_SIZE = 1024;
    const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout
    List<XDocument> asyncClientServers;

    [TestMethod]
    public void CheckoutForMaster_OneClientServer_ReturnsAllMasterStatus()
    {
        string urlTest = CombineWithSccBaseUrl("/v1/clientservers/checkout");
        ...
        IAsyncResult asyncResult1 = ExecuteAsyncRequest(urlTest, xmlPayloadAllMaster);
        IAsyncResult asyncResult2 = ExecuteAsyncRequest(urlTest, xmlPayloadAllWait);
    }

    private IAsyncResult ExecuteAsyncRequest(string url, string payload)
    {
        try
        {

            byte[] bytes = Encoding.UTF8.GetBytes(payload);

            Uri uri = new Uri(url);
            // Create a HttpWebrequest object to the desired URL.
            HttpWebRequest myHttpWebRequest1 = (HttpWebRequest)WebRequest.Create(uri);
            myHttpWebRequest1.Method = "POST";
            myHttpWebRequest1.CachePolicy = new RequestCachePolicy(       RequestCacheLevel.NoCacheNoStore);
            myHttpWebRequest1.ContentLength = bytes.Length;
            myHttpWebRequest1.ContentType = "application/xml;charset=UTF-8";
            myHttpWebRequest1.Timeout = 105000;

            using (Stream putStream = myHttpWebRequest1.GetRequestStream())
            {
                putStream.Write(bytes, 0, bytes.Length);
            }

            // Create an instance of the RequestState and assign the previous myHttpWebRequest1
            // object to it's request field.  
            RequestState myRequestState = new RequestState();
            myRequestState.request = myHttpWebRequest1;

            // Start the asynchronous request.
            IAsyncResult result = myHttpWebRequest1.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
        }
        catch (WebException e)
        {
            string t = e.Message;
        }
        catch (Exception e)
        {
            string t = e.Message;
        }

        return null;

    }


    private void RespCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            // State of request is asynchronous.
            RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
            HttpWebRequest myHttpWebRequest2 = myRequestState.request;
            myRequestState.response = (HttpWebResponse)myHttpWebRequest2.EndGetResponse(asynchronousResult);

            // Read the response into a Stream object.
            Stream responseStream = myRequestState.response.GetResponseStream();
            myRequestState.streamResponse = responseStream;

            if(myRequestState.response != null && myRequestState.response.StatusCode == HttpStatusCode.OK)
            {
                StreamReader reader = new StreamReader(myRequestState.response.GetResponseStream(), Encoding.GetEncoding(1251));
                XDocument xResult = XDocument.Load(reader);
                asyncClientServers.Add(xResult);
            }
        }
        catch (WebException e)
        {
            // Need to handle the exception
        }
    }

 }
4

2 に答える 2

1

GetRequestStreamのドキュメントによると:

アプリケーションは、特定のリクエストに対して同期メソッドと非同期メソッドを混在させることはできません。GetRequestStreamメソッドを呼び出す場合は、GetResponseメソッドを使用して応答を取得する必要があります。

同期メソッドを混在させようとするとどうなるかはわかりませんが、そうすることで予期しない結果が得られるので、おそらくを使用することをお勧めしますBeginGetRequestStream

于 2012-06-14T01:25:25.427 に答える
1

これは疑わしいようです:

using (Stream putStream = myHttpWebRequest1.GetRequestStream())
{
    putStream.Write(bytes, 0, bytes.Length);
}
// ... etc
IAsyncResult result = myHttpWebRequest1.BeginGetResponse(
                      new AsyncCallback(RespCallback), myRequestState);

BeginGetResponse() を呼び出す前に、すでにリクエストを作成して終了しているようです

于 2012-06-14T00:57:57.810 に答える