Asp.net web api IE9中的CORS Post失败

Asp.net web api IE9中的CORS Post失败,asp.net-web-api,internet-explorer-9,http-post,cors,Asp.net Web Api,Internet Explorer 9,Http Post,Cors,因此,我正在创建一个应用程序,它使用CORS与.NETMVC侧车项目进行通信。除了在IE9中,POST请求失败之外,一切都很好。我有一个允许开始工作的程序,但是POST请求仍然有问题。IE9似乎去掉了contentType标题。服务器最终将其解释为appapplication/octet-stream,而不是text/plain,据我所知,它实际上是由设置的 在我的WebAPIConfig.cs中,我有以下函数(由Register调用): 然而,Fiddler仍然告诉我请求没有contentTy

因此,我正在创建一个应用程序,它使用CORS与.NETMVC侧车项目进行通信。除了在IE9中,POST请求失败之外,一切都很好。我有一个允许开始工作的程序,但是POST请求仍然有问题。IE9似乎去掉了
contentType
标题。服务器最终将其解释为
appapplication/octet-stream
,而不是
text/plain
,据我所知,它实际上是由
设置的

在我的WebAPIConfig.cs中,我有以下函数(由
Register
调用):

然而,Fiddler仍然告诉我请求没有contentType,服务器无法处理
应用程序/octet流的contentType

有人用过吗?

根据 CORS受到以下浏览器的支持:Firefox 3.5+、Internet Explorer 10+、Google Chrome 4.0+、Safari 4.0+, Opera 12.0+、Opera Mobile 12.0+

XDomainRequest可能会帮助您(IE8+)


XDR
var xdr=新的XDomainRequest();
xdr.open(“get”http://localhost:6504/api/resourcename/1");
xdr.onload=函数()
{
警报(xdr.responseText);
}
xdr.send();
根据 CORS受到以下浏览器的支持:Firefox 3.5+、Internet Explorer 10+、Google Chrome 4.0+、Safari 4.0+, Opera 12.0+、Opera Mobile 12.0+

XDomainRequest可能会帮助您(IE8+)


XDR
var xdr=新的XDomainRequest();
xdr.open(“get”http://localhost:6504/api/resourcename/1");
xdr.onload=函数()
{
警报(xdr.responseText);
}
xdr.send();

我最终通过创建自己的
MediaTypeFormatter
解决了这个问题,它可以与
应用程序/octet流一起工作。(我的服务器不接受调用,因为我没有执行IIS重置(duh),但它仍然没有正确解析对象

这是我最终使用的格式化程序

public class OctetStreamMediaTypeFormatter : MediaTypeFormatter
{
    public OctetStreamMediaTypeFormatter()
    {
        // We only support octet-stream
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var task = new Task<object>(() =>
        {
            using (var reader = new StreamReader(readStream, Encoding.UTF8))
            {
                // The data is passed as somethign identical to a query string (but not in the query string)
                var dic = HttpUtility.ParseQueryString(reader.ReadToEnd());
                var json = JsonConvert.SerializeObject(dic.AllKeys.ToDictionary(k =>
                {
                    if (k.EndsWith("[]"))
                    {
                        return k.Substring(0, k.IndexOf("[]", StringComparison.OrdinalIgnoreCase));
                    }
                    else
                    {
                        return k;
                    }
                }, k =>
                {
                    var val = dic[k];
                    // We need to speciallly handle arrays
                    if (k.EndsWith("[]"))
                    {
                        // parse into separate values;
                        var values = val.Split(',');
                        val = values.Aggregate("[", (current, value) => current + ("'" + value + "',"));
                        if (val.EndsWith(","))
                        {
                            val = val.Substring(0, val.Length - 1);
                        }
                        val += "]";
                    }
                    return val;
                }));
                // It still puts it in as a string, which is not what we want, so we need to remove the quotes
                json = json.Replace("\"[", "[").Replace("]\"", "]");
                var obj = JsonConvert.DeserializeObject(json, type);
                return obj;
            }
        });

        task.Start();

        return task;
    }

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

    public override bool CanWriteType(Type type)
    {
        return true;
    }
}
公共类八位流MediaTypeFormatter:MediaTypeFormatter
{
公共八位流媒体类型格式化程序()
{
//我们只支持八位元流
添加(新的MediaTypeHeaderValue(“应用程序/八位字节流”);
}
公共重写任务ReadFromStreamAsync(类型类型、流readStream、HttpContent内容、IFormatterLogger formatterLogger)
{
变量任务=新任务(()=>
{
使用(var reader=newstreamreader(readStream,Encoding.UTF8))
{
//数据作为与查询字符串相同的something传递(但不在查询字符串中)
var dic=HttpUtility.ParseQueryString(reader.ReadToEnd());
var json=JsonConvert.SerializeObject(dic.AllKeys.ToDictionary)(k=>
{
如果(k.EndsWith(“[]”)
{
返回k.Substring(0,k.IndexOf(“[]”,StringComparison.OrdinalIgnoreCase));
}
其他的
{
返回k;
}
},k=>
{
var-val=dic[k];
//我们需要专门处理数组
如果(k.EndsWith(“[]”)
{
//解析成不同的值;
var值=val.Split(',');
val=values.Aggregate(“[”,(当前,值)=>current+(“'”+value+“,”);
如果(val.EndsWith(“,”))
{
val=val.Substring(0,val.Length-1);
}
val+=“]”;
}
返回val;
}));
//它仍然将其作为字符串放入,这不是我们想要的,因此我们需要删除引号
json=json.Replace(“\”[”,“[”).Replace(“]\”,“]”);
var obj=JsonConvert.DeserializeObject(json,类型);
返回obj;
}
});
task.Start();
返回任务;
}
公共覆盖布尔CanReadType(类型)
{
返回true;
}
公共重写bool CanWriteType(类型)
{
返回true;
}
}

我最终通过创建自己的
MediaTypeFormatter
解决了这个问题,该程序与
应用程序/octet流
一起工作(我的服务器没有接受调用,因为我没有进行IIS重置(duh),但它仍然没有正确解析对象

这是我最终使用的格式化程序

public class OctetStreamMediaTypeFormatter : MediaTypeFormatter
{
    public OctetStreamMediaTypeFormatter()
    {
        // We only support octet-stream
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var task = new Task<object>(() =>
        {
            using (var reader = new StreamReader(readStream, Encoding.UTF8))
            {
                // The data is passed as somethign identical to a query string (but not in the query string)
                var dic = HttpUtility.ParseQueryString(reader.ReadToEnd());
                var json = JsonConvert.SerializeObject(dic.AllKeys.ToDictionary(k =>
                {
                    if (k.EndsWith("[]"))
                    {
                        return k.Substring(0, k.IndexOf("[]", StringComparison.OrdinalIgnoreCase));
                    }
                    else
                    {
                        return k;
                    }
                }, k =>
                {
                    var val = dic[k];
                    // We need to speciallly handle arrays
                    if (k.EndsWith("[]"))
                    {
                        // parse into separate values;
                        var values = val.Split(',');
                        val = values.Aggregate("[", (current, value) => current + ("'" + value + "',"));
                        if (val.EndsWith(","))
                        {
                            val = val.Substring(0, val.Length - 1);
                        }
                        val += "]";
                    }
                    return val;
                }));
                // It still puts it in as a string, which is not what we want, so we need to remove the quotes
                json = json.Replace("\"[", "[").Replace("]\"", "]");
                var obj = JsonConvert.DeserializeObject(json, type);
                return obj;
            }
        });

        task.Start();

        return task;
    }

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

    public override bool CanWriteType(Type type)
    {
        return true;
    }
}
公共类八位流MediaTypeFormatter:MediaTypeFormatter
{
公共八位流媒体类型格式化程序()
{
//我们只支持八位元流
添加(新的MediaTypeHeaderValue(“应用程序/八位字节流”);
}
公共重写任务ReadFromStreamAsync(类型类型、流readStream、HttpContent内容、IFormatterLogger formatterLogger)
{
变量任务=新任务(()=>
{
使用(var reader=newstreamreader(readStream,Encoding.UTF8))
{
//数据作为与查询字符串相同的something传递(但不在查询字符串中)
var dic=HttpUtility.ParseQueryString(reader.ReadToEnd());
var json=JsonConvert.SerializeObject(dic.AllKeys.ToDictionary)(k=>
{
如果(k.EndsWith(“[]”)
{
返回k.Substring(0,k.IndexOf(“[]”,StringComparison.OrdinalIgnoreCase));
}
其他的
{
返回k;
}
},k=>
{
var-val=dic[k];
//我们需要专门处理数组
如果(k.EndsWith(“[]”)
{
//解析成不同的值;
变量
public class OctetStreamMediaTypeFormatter : MediaTypeFormatter
{
    public OctetStreamMediaTypeFormatter()
    {
        // We only support octet-stream
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var task = new Task<object>(() =>
        {
            using (var reader = new StreamReader(readStream, Encoding.UTF8))
            {
                // The data is passed as somethign identical to a query string (but not in the query string)
                var dic = HttpUtility.ParseQueryString(reader.ReadToEnd());
                var json = JsonConvert.SerializeObject(dic.AllKeys.ToDictionary(k =>
                {
                    if (k.EndsWith("[]"))
                    {
                        return k.Substring(0, k.IndexOf("[]", StringComparison.OrdinalIgnoreCase));
                    }
                    else
                    {
                        return k;
                    }
                }, k =>
                {
                    var val = dic[k];
                    // We need to speciallly handle arrays
                    if (k.EndsWith("[]"))
                    {
                        // parse into separate values;
                        var values = val.Split(',');
                        val = values.Aggregate("[", (current, value) => current + ("'" + value + "',"));
                        if (val.EndsWith(","))
                        {
                            val = val.Substring(0, val.Length - 1);
                        }
                        val += "]";
                    }
                    return val;
                }));
                // It still puts it in as a string, which is not what we want, so we need to remove the quotes
                json = json.Replace("\"[", "[").Replace("]\"", "]");
                var obj = JsonConvert.DeserializeObject(json, type);
                return obj;
            }
        });

        task.Start();

        return task;
    }

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

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