1

次のベストプラクティスの実装を探しています...

.asmx Webサービスを呼び出すJQueryスクリプトがありますが、ドメイン外で呼び出されるとロードに失敗します。これは、HTMLをPhoneGapに移動するとどうなるかを理解しています。

JSONPを使用するための最良/唯一のソリューションはありますか?

私は.asmxやjqueryなどに固執していません。うまく機能するあなたが使用したアイデアを受け入れてください。

サーバーでhtml5からメソッドを呼び出せるようにする必要があります。(そしてhtml5アプリはオフラインで実行されません)。

ありがとう!

4

4 に答える 4

0

はい、JSONPがあなたの問題の答えです。JSONPまたは「JSONwithpadding」はJSON拡張機能であり、呼び出し自体の入力引数としてプレフィックスが指定され、XMLHttpRequestの同一生成元ポリシーを克服するためにトリックを実行します。

続きを読む続きを読む

これらの2つのリンクはあなたを助けるはずです。何か問題があれば私に知らせてください。

于 2012-12-17T05:31:39.967 に答える
0

JSONPの詳細については、ここをクリックしてください

単純にJSONPは次のよ​​うに定義できます(これはRemy Sharpのブログからの抜粋です)

JSONPはスクリプトタグインジェクションであり、サーバーからの応答をユーザー指定の関数に渡します

このリンクは、問題の解決策を見つけるのにも役立ちます。

于 2012-12-17T05:45:39.460 に答える
0

Phonegapを使用している場合は、file://プロトコルを使用してローカルのhtmlファイルをロードします。ロードの失敗は、おそらく同一生成元ポリシーと関係があり、file://プロトコルには適用されません。したがって、file://プロトコルを使用してhtmlをロードすると、クロスブラウザ呼び出しを行うことができます。詳細については、この記事を確認してください。ドメインホワイトリストに関するPhonegapのドキュメントも確認してください。

幸運を!

于 2012-12-17T10:39:31.260 に答える
0

ここでは、JSONPが間違いなく最善のOPTIONS方法であり、サーバー側のコードでメソッドを許可する必要がある場合は、これと同様のコードを実装できます。(注:この例は技術的にはMVC用ですが、適応させることができます。)

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();

        filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");

        string rqstMethod = HttpContext.Current.Request.Headers["Access-Control-Request-Method"];
        if (rqstMethod == "OPTIONS" || rqstMethod == "POST")
        {
            filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
            filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Headers", "X-Requested-With, Accept, Access-Control-Allow-Origin, Content-Type");
        }
        base.OnActionExecuting(filterContext);
    }
}
[HttpGet]
[AllowCrossSiteJsonAttribute]
public JsonpResult CommunicateCard(CommunicateCardModel ccm)
{
    return ModelState.IsValid
        ? this.ValidCommunicateCardBuilder(ccm)
        : this.InvalidFormSummary(ccm);
}

補足:これが私が使用しているJsonpResultです。素晴らしい作品。

namespace System.Web.Mvc
{
    #region usings
    using System;

    using WebService.Attributes;
    using WebService.Domain.Models;
    using WebService.Exceptions;
    using WebService.Models.ViewModels;
    using Extensions;
    using WebService.Utilities;
    #endregion

    public class JsonpResult : ActionResult
    {
        public Object Data { get; set; }
        public string JsonCallback { get; set; }
        public bool? Success { get; set; }


        public override void ExecuteResult(ControllerContext context)
        {

            // Create a JsonResponse that we can Send out

            // Check for the callback parameter
            this.JsonCallback = context.HttpContext.Request["callback"];

            // if the "callback" doesn't exist, we want to check for "jsoncallback"
            if (string.IsNullOrEmpty(this.JsonCallback))
                this.JsonCallback = context.HttpContext.Request["jsoncallback"];

            // If we've made it this far, we know that the object sent is an
            // object that we can serialize and Send back as valid JSON. We now
            // need to wrap it in our JsonViewModel for consistancy. NOTE: We're
            // using the AsList() extension method to ensure that we're
            // returning an Array since our application (Sencha Touch) requires
            // all data to be in array format.
            if (!Data.GetType().IsGenericType)
                Data = Data.AsList();

            // Until now we the data is either an ERROR, or null
            // if it's null, and the Data is not null, we set Success = true
            // If Success is false, it's because we set it to false when we threw an error
            // if that's the case, we keep it false for the client.
            if (Success == null) Success = true;


            var jsonViewModel = new JsonViewModel
                {
                    results = this.Data,
                    // We know that Success is either True or False so we can
                    // safely cast the nullable bool to a bool.
                    success = (bool)this.Success
                };
            WriteOut(jsonViewModel, context);
        }

        /// <summary>
        /// Write Out the JsonP Response to the Controller.
        /// </summary>
        /// <param name="jsonResponse">The unserialized object</param>
        /// <param name="context">Controller Context</param>
        private void WriteOut(JsonViewModel jsonResponse, ControllerContext context)
        {
            var response = context.HttpContext.Response;
            response.ContentType = "application/javascript";
            response.Write(JsonUtility.Serialize(jsonResponse, this.JsonCallback));
        }
    }

    /// <summary>
    /// extension methods for the controller to allow jsonp.
    /// </summary>
    public static class ContollerExtensions
    {
        public static JsonpResult Jsonp(this Controller controller, Object data)
        {
            return new JsonpResult { Data = data };
        }

        public static JsonpResult Jsonp(this Controller controller, Object data, bool success)
        {
            // We don't ever want to pass in a "true" success. We only want to 
            // know if it failed.
            if (success)
            {
                return new JsonpResult { Data = data };
            }

            return new JsonpResult { Success = false, Data = data };
        }
    }
}
于 2013-04-09T21:13:21.153 に答える