0

WCF Rest Serviceを使用していますが、同じWebサイトのaspxページからこれを呼び出そうとしています(つまり、RESTとWebサイトの両方が同じWebサイトにあります)。セッションをアクティブに保つ必要があります。次のようになります

。セッションCookieを渡さないと、サービスは別のセッションを作成します。セッションCookieを渡すと、httpwebrequestに時間がかかり、タイムアウトになります。

私が間違っていることはありますか?または、asp.netページの呼び出しと同じセッションを維持しながらRESTサービスを呼び出すためのより良い方法があるかもしれません。

私は次のREST署名を持っています:

        [OperationContract()]
        [WebInvoke(Method = "POST",
         BodyStyle = WebMessageBodyStyle.WrappedRequest,
         RequestFormat = WebMessageFormat.Json,
         ResponseFormat = WebMessageFormat.Json)]
        string GetFilterQuery(LookupRequestDTO request);

コードビハインドから、私はこのサービスを次のように呼んでいます:

  HttpWebRequest req = WebRequest.Create(url)
                                 as HttpWebRequest;

        req.Method = "POST";
        req.Credentials = CredentialCache.DefaultNetworkCredentials;
        string result = null;
        req.ContentType = "application/json";
        req.Referer = this.Page.Request.Url.AbsoluteUri;
        var cookieContainer = new CookieContainer();//pass session state;    
        cookieContainer.Add(new Cookie() { Domain = req.RequestUri.Host, Name = "ASP.NET_SessionId", Value = HttpContext.Current.Session.SessionID });

        req.CookieContainer = cookieContainer;

        string data = null; 
        //code that populates data goes here ... (excluded for simplification)

        using (Stream webStream = req.GetRequestStream())
        using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
        {
            requestWriter.Write(data);
        }


   using (HttpWebResponse resp = req.GetResponse()  //timeout occurs here
                                  as HttpWebResponse)
    {
        StreamReader reader =
            new StreamReader(resp.GetResponseStream());

    }

$ .ajaxアプローチを使用してjavascriptから呼び出された場合、サービスは正しく機能し、同じセッションを維持します

4

1 に答える 1

0

私はこれについてさらに調査を行いましたが、最善のアプローチはアーキテクチャを再設計することでした。基本的に、コードビヒッドからRESTを呼び出すことはあまり意味がありません。それは単に適切なツールではありません。wcfサービスを作成するのではなく、実際のコードを呼び出しています。ただし、コードは直接呼び出されていません。コマンドパターンを使用しています。これは、関心の分離を維持するためです(wcf通信のパフォーマンスのボトルネックなし)。

タイムアウトの問題の解決策がある場合は、お知らせください。今のところ、これを回答済みとしてマークします。

于 2013-01-28T12:20:22.467 に答える