代码片段,google了半天,找到的都是4.5 rc,或之前版本的代码,发现都不能用,正式版后有些方法做了修改。我重新修改一下分享给大家
public static class HttpRequestMessageExtensions
{
public static string QueryString(this HttpRequestMessage request, string name)
{
string requestUri = request.RequestUri.Query;
string[] queries = requestUri.Split('&');
foreach (string s in queries)
{
if (s.Contains(name))
{
int index = s.IndexOf('=');
int stopIndex = s.IndexOf('&', index);
if (stopIndex != -1)
return s.Substring(index + 1, stopIndex - index - 1);
else
return s.Substring(index + 1, s.Length - index - 1);
}
}
return string.Empty;
}
}
public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
{
private string callbackQueryParameter;
private HttpRequestMessage httpRequest;
public JsonpMediaTypeFormatter()
{
SupportedMediaTypes.Add(DefaultMediaType);
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));
MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", DefaultMediaType));
}
public string CallbackQueryParameter
{
get { return callbackQueryParameter ?? "callback"; }
set { callbackQueryParameter = value; }
}
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
{
httpRequest = request;
return base.GetPerRequestFormatterInstance(type, request, mediaType);
}
public override Task WriteToStreamAsync(
Type type, object value, Stream stream, HttpContent content, TransportContext transportContext)
{
string callback;
if (IsJsonpRequest(out callback))
{
return Task.Factory.StartNew(() =>
{
var writer = new StreamWriter(stream);
writer.Write(callback + "(");
writer.Flush();
base.WriteToStreamAsync(type, value, stream,content, transportContext).Wait();
writer.Write(")");
writer.Flush();
});
}
else
{
return base.WriteToStreamAsync(type, value, stream, content, transportContext);
}
}
private bool IsJsonpRequest(out string callback)
{
callback = null;
//if (HttpContext.Current.Request.HttpMethod != "GET")
if(httpRequest.Method!=HttpMethod.Get)
return false;
//var uri = httpRequest.RequestUri;
//var query = uri.Query;
callback = httpRequest.QueryString(CallbackQueryParameter);
return !string.IsNullOrEmpty(callback);
}
}
var config = new HttpSelfHostConfiguration(baseAddress);
// Set the max message size to 1M instead of the default size of 64k and also
// set the transfer mode to 'streamed' so that don't allocate a 1M buffer but
// rather just have a small read buffer.
config.MaxReceivedMessageSize = 1024 * 1024;
config.TransferMode = TransferMode.Streamed;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
$('#getjson').bind('click', function () {
$.getJSON("http://192.168.103.135:8080/api/products/1?jsoncallback=?",
function (data) {
$("#result").append(data);
return;
$("#result").append(data.Image);
$("<img/>").attr("src", "data:image/jpeg;base64," + data.Image).appendTo("#result");
return;
$.each(data, function (i, item) {
$("#result").append(item.Name);
$("<img/>").attr("src", item.Image).appendTo("#result");
});
});
});