2

ここに私が理解できないものがあります。

クライアントにブラウザでキャッシュしてもらいたい大きな JSON データ セットがあります。jquery AJAX を使用して ac# Web メソッドを呼び出しています。

[System.Web.Services.WebMethod]

jQuery は次のとおりです。

            $.ajax({
                url: "/Ajax/ItemAffinity.aspx/FetchAffinityItems?ItemID=" + escape($("#SearchSelectedPageID").val()),
                type: "POST",
                data: "{}",
                cache: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                //contentType: "application/json; charset=utf-8",
                success: function (data) {
                   //do cool stuff
                }
            });

Web メソッド内のサーバーで何を指定しても、HTTP HEADERS は常に次のように返されます。

Cache-Control   no-cache
Content-Length  919527
Content-Type    application/json; charset=utf-8
Expires -1

以下のように、Web サービスに入力した設定はすぐに無視されます。

        HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(1));
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);

Web サービスは HTTP GET では機能しませんよね? または、これをどのように行う必要がありますか?

ありがとう!

4

2 に答える 2

1

最大限に制御するために、次のようにキャッシュ応答ヘッダーを設定できます。

    <WebMethod()> _
    <ScriptMethod(UseHttpGet:=True)> _
    Public Function get_time() As String

        'Cache the reponse to the client for 60 seconds:
        Dim context As HttpContext = HttpContext.Current
        Dim cacheExpires As New TimeSpan(0, 0, 0, 60)
        SetResponseHeaders(context, HttpCacheability.Public, cacheExpires)

        Return Date.Now.ToString

    End Function

    ''' <summary>
    ''' Sets the headers of the current http context response.
    ''' </summary>
    ''' <param name="context">A reference to the current context.</param>
    ''' <param name="cacheability">The cachability setting for the output.</param>
    ''' <param name="delta">The amount of time to cache the output. Set to Nothing if NoCache.</param>
    ''' <remarks></remarks>
    Public Shared Sub SetResponseHeaders(ByRef context As HttpContext,
                                         cacheability As HttpCacheability,
                                         delta As TimeSpan)

        If Not IsNothing(context) Then
            Dim cache As HttpCachePolicy = context.ApplicationInstance.Response.Cache
            cache.SetCacheability(cacheability)

            Select Case cacheability
                Case HttpCacheability.NoCache
                    'prevent caching:
                    Exit Select
                Case Else
                    'set cache expiry:
                    Dim dateExpires As Date = Date.UtcNow
                    dateExpires = dateExpires.AddMinutes(delta.TotalMinutes)
                    'set expiry date:
                    cache.SetExpires(dateExpires)
                    Dim maxAgeField As Reflection.FieldInfo = cache.GetType.GetField("_maxAge", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
                    If Not IsNothing(maxAgeField) Then
                        maxAgeField.SetValue(cache, delta)
                    End If
            End Select
        End If

    End Sub

次に、次のように ajax GET を使用して Web サービスを呼び出します。

var postObj = {
    ItemID: 12
}

$.ajax({
    url: webserviceUrl,
    type: 'GET',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: postObj,
    success: function (reponse) {
        alert(response.d);
    }
});
于 2012-12-30T16:54:16.110 に答える
0

キャッシュを設定できる WebMethod 属性のプロパティがあります。これがヘッダーにキャッシュ値を設定するかどうかはわかりません。

http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.71%29.aspx#vbtskusingwebmethodattributecacheduration

于 2012-12-07T18:35:06.640 に答える