我正在尝试从Angular 4单页面应用程序(在http://localhost:4200/本地运行)向REST WCF Web服务端点发出JSON内容的POST(在本地运行,端点如下: http://localhost:3026/ToshlSrvc.svc/Add)。
我使用标准的Http.post()方法+ RxJs扩展来发出POST请求。 Web服务实际上接收POST和相关内容,并且它正确地执行它的设计(将反序列化的对象添加到实体框架上下文,持久保存到DB并返回新的Id),因此在所有客户端和服务器端都没有错误。
不幸的是,用于监听http.post()的subscribe()方法的“数据”args始终为NULL!我无法将新的Id包含在POST响应中!但是,如果我检查Chrome的网络活动,或者如果我发布PostMan帖子,我会看到响应正文如下:
<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1250</int>
(在这种情况下为1250是正确的新ID)
我无法弄清楚这里有什么问题。 你有什么建议吗?
感谢任何帮助。
案例
以下是我如何访问webService的TypeScript代码:
public Add(resource: Entry): void{
const WEBSERVICE_ADDRESS: string = "http://localhost:3026/ToshlSrvc.svc";
const headers = new HttpHeaders().set( 'Content-Type', 'application/json; charset=utf-8');
return this.http.post(this.WEBSERVICE_ADDRESS + '/Add', JSON.stringify(resource), { headers: headers})
.catch(this.handleError);
.subscribe(data => {
console.log(data); //I always get null!
});
}
这是webservice端点的声明:
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Add")]
int Add(EntryDTO entry);
我的webservice终端的主体:
int IToshlSrvc.Add(EntryDTO entry)
{
Entry newEntry = null;
//Create new entry and add to collection
if (entry.Type == eTypeDTO.Expense) {
newEntry = new ExpenseEntry();
newEntry.Id = this._provider.Expenses.Max(x => x.Id) + 1;
this._provider.Expenses.Add((ExpenseEntry)newEntry);
}
else {
newEntry = new IncomeEntry();
newEntry.Id = this._provider.Incomes.Max(x => x.Id) + 1;
this._provider.Incomes.Add((IncomeEntry)newEntry);
}
//Set values
newEntry.Categories = entry.Categories;
newEntry.Date = Convert.ToDateTime(entry.Date);
newEntry.Description = entry.Description;
newEntry.Value = entry.Value;
//Returns
return newEntry.Id;
}
OPTIONS预检和POST请求检查: https://www.dropbox.com/s/900q3oor6dex0hl/issueOPTIONS.png?dl=0 https://www.dropbox.com/s/no8o78oqsolxk21/issuePOST.png?dl=0
为了允许这些不同域之间的通信,我已经启用了CORS,就像这里暴露https://enable-cors.org/server_wcf.html +我需要在我的web服务中添加一个空的GetOptions()端点,如此处公开:Ajax POST to WCF Rest CORS-compliant WebService throws error 405。< / p>
我需要这样做,因为如果没有上述GetOptions()方法,Enable-Cors.org策略根本不起作用。我认为这一点或错误的CORS设置可以解决这个问题。
答案 0 :(得分:1)
您的服务返回XML。尝试将响应类型设置为JSON。