$ resource在Internet Explorer中发布空对象

时间:2016-02-15 14:39:53

标签: angularjs wcf internet-explorer

我在Angular 1.4.9中遇到了Internet Explorer 11和$resource服务的问题。我的代码调用Web服务来发布一些对象:

var FooServiceHandle = $resource('some/Address/');
var fooServiceHandle = new FooServiceHandle ();

fooServiceHandle.bar = someData;

fooServiceHandle.$save().then(function () { console.log('saved') });

另一方面,Web服务是WCF REST。

[OperationContract]
[FaultContract(typeof(RegistrationNotAllowedFault))]
[WebInvoke(UriTemplate = "some/Address/", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]
string Foo(Bar bar);

当我使用IE时,Web服务中Foo方法的参数为null(但调用了服务方法)。就在$save调用fooServiceHandle.bar变量未定义之前,而是一个正确的对象。我的代码适用于Chrome 48和Firefox 44。

更新

奇怪的是,当我查看IE开发人员工具的网络选项卡时,它显示了正确的请求体(即JSON)。此外,当我将请求主体复制粘贴到SoapUI时,它正确执行。 IE请求的HTTP方法是OK(POST),也是内容类型(application / json)。第一个IE请求有结果307,后来又有400个。

enter image description here

UPDATE2

我看不出Chrome和IE之间的请求有任何重大差异,除了一个 - 在IE的JSON键顺序略有不同,但结构是正确的。

UPDATE3

与$ http服务完全相同的问题。在Chrome中它可以工作,WCF绑定一个对象,在IE中它没有并且在服务方法中获得null参数。

var req = {
    method: 'POST',
    url: 'some/Address/',
    data: { bar: someData}
}

$http(req).then(function(){console.log('saved')}, function(){});

1 个答案:

答案 0 :(得分:0)

这个问题的原因令人难以置信。不知何故,Internet Explorer和WCF一起无法在服务方法地址的末尾处理斜杠。删除反斜杠消除了这个问题:

UriTemplate = "some/Address/" => UriTemplate = "some/Address"
var FooServiceHandle = $resource('some/Address/'); => var FooServiceHandle = $resource('some/Address');

在Chrome和Firefox中,反斜杠都不是问题,可能会修剪它。