Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Web服务没有在JSONP回调中包装JSON?_Jquery_Ajax_Asp.net Web Api_Callback_Jsonp - Fatal编程技术网

Jquery Web服务没有在JSONP回调中包装JSON?

Jquery Web服务没有在JSONP回调中包装JSON?,jquery,ajax,asp.net-web-api,callback,jsonp,Jquery,Ajax,Asp.net Web Api,Callback,Jsonp,我试图使.NETMVCWebAPI返回JSONP。我引用了JsonpMediaTypeFormatter,基于它实现了一个JsonFormatter,并在我的应用程序_Start()函数中注册了它。。。而带有“&callback=?”的客户端json调用仍然不会使用jsonp回调包装返回。。。我错过什么了吗 我试着在formatter类中设置一个断点,它似乎从未被调用过 代码位: 格式化程序: /// <summary> /// Handles JsonP requests

我试图使.NETMVCWebAPI返回JSONP。我引用了JsonpMediaTypeFormatter,基于它实现了一个JsonFormatter,并在我的应用程序_Start()函数中注册了它。。。而带有“&callback=?”的客户端json调用仍然不会使用jsonp回调包装返回。。。我错过什么了吗

我试着在formatter类中设置一个断点,它似乎从未被调用过

代码位:

格式化程序:

    /// <summary>
/// Handles JsonP requests when requests are fired with text/javascript
/// </summary>
public class JsonpFormatter : JsonMediaTypeFormatter
{

    public JsonpFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

        JsonpParameterName = "callback";
    }

    /// <summary>
    ///  Name of the query string parameter to look for
    ///  the jsonp function name
    /// </summary>
    public string JsonpParameterName { get; set; }

    /// <summary>
    /// Captured name of the Jsonp function that the JSON call
    /// is wrapped in. Set in GetPerRequestFormatter Instance
    /// </summary>
    private string JsonpCallbackFunction;


    public override bool CanWriteType(Type type)
    {
        return true;
    }

    /// <summary>
    /// Override this method to capture the Request object
    /// </summary>
    /// <param name="type"></param>
    /// <param name="request"></param>
    /// <param name="mediaType"></param>
    /// <returns></returns>
    public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType)
    {
        var formatter = new JsonpFormatter()
        {
            JsonpCallbackFunction = GetJsonCallbackFunction(request)
        };

        // this doesn't work unfortunately
        //formatter.SerializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;

        // You have to reapply any JSON.NET default serializer Customizations here    
        formatter.SerializerSettings.Converters.Add(new StringEnumConverter());
        formatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

        return formatter;
    }


    public override Task WriteToStreamAsync(Type type, object value,
                                    Stream stream,
                                    HttpContent content,
                                    TransportContext transportContext)
    {
        if (string.IsNullOrEmpty(JsonpCallbackFunction))
            return base.WriteToStreamAsync(type, value, stream, content, transportContext);

        StreamWriter writer = null;

        // write the pre-amble
        try
        {
            writer = new StreamWriter(stream);
            writer.Write(JsonpCallbackFunction + "(");
            writer.Flush();
        }
        catch (Exception ex)
        {
            try
            {
                if (writer != null)
                    writer.Dispose();
            }
            catch { }

            var tcs = new TaskCompletionSource<object>();
            tcs.SetException(ex);
            return tcs.Task;
        }

        return base.WriteToStreamAsync(type, value, stream, content, transportContext)
                   .ContinueWith(innerTask =>
                   {
                       if (innerTask.Status == TaskStatus.RanToCompletion)
                       {
                           writer.Write(")");
                           writer.Flush();
                       }

                   }, TaskContinuationOptions.ExecuteSynchronously)
                    .ContinueWith(innerTask =>
                    {
                        writer.Dispose();
                        return innerTask;

                    }, TaskContinuationOptions.ExecuteSynchronously)
                    .Unwrap();
    }

    /// <summary>
    /// Retrieves the Jsonp Callback function
    /// from the query string
    /// </summary>
    /// <returns></returns>
    private string GetJsonCallbackFunction(HttpRequestMessage request)
    {
        if (request.Method != HttpMethod.Get)
            return null;

        var query = HttpUtility.ParseQueryString(request.RequestUri.Query);
        var queryVal = query[this.JsonpParameterName];

        if (string.IsNullOrEmpty(queryVal))
            return null;

        return queryVal;
    }
}

尝试使用nugget包WebApiContrib.Formatting.Jsonp Jsonp formatter,在应用程序启动时这样注册它

GlobalConfiguration.Configuration.AddJsonpFormatter();
我刚刚创建了一个MCV4项目,用于我正在处理和需要的东西,添加了一个api控制器,可以对它进行JSONP调用。项目地点如下:


你得到了什么?@JonathanM它返回了一个错误“[回调函数]未调用”。响应文本是纯JSON对象,未包装。
GlobalConfiguration.Configuration.AddJsonpFormatter();