我正在尝试使用本地地址从其他项目调用WCF服务。我在同一解决方案资源管理器中有两个项目。一个项目有服务,另一个是Web应用程序,我在javascript中使用Ajax来调用WCF服务。 以下是我的javascript代码,
function sclick() {
alert("m here");
$.ajax({
type: "POST",
url: "http://localhost:4780/Service1.svc/myfunction",
contentType: "application/json; charset=utf-8 ",
dataType: "json",
success: success,
error: fail
})
}
function success(result) {
alert(result);
//alert("Success" + result.myfunctionResult);
}
function fail(result) {
alert("Fail..... " + result.statusText + ": " + result.status);
}
流程转到成功函数,但我在结果对象中得到null。 ajax部分中的URL是通过在浏览器中查看service1.svc文件获得的URL。 谁能告诉我哪里出错了! 它在同一个项目中工作正常。但跨域不起作用。当我从其他项目调用该服务时,它返回null。我在服务中给出了突破点。断点显示正确的值,但它不会出现在我的javascript代码中。
答案 0 :(得分:0)
您不应该通过regaular Web服务调用与开箱即用的WCF服务交谈,这可能更复杂。见:http://social.msdn.microsoft.com/Forums/vstudio/en-US/c896b564-7a9b-423d-a42d-d36c33c46e7d/consume-a-wcf-service-as-a-url
这是因为WCF具有框架使用的数据的“开销”。另外,WCF配置可能有所不同:它可能是REST,SOAP甚至是Tcp或命名管道。
更简单的方法是生成WCF客户端: http://msdn.microsoft.com/en-us/library/ms733133.aspx
而不是 从ajax调用客户端代理,而不是尝试直接调用服务器。
假设您正在运行.Net Web应用程序。 否则,请参阅如何直接与服务对话。这是一个关于如何使用Java执行此操作的示例: http://hoonzis.blogspot.co.il/2011/07/consuming-wcf-services-with-java-client.html
最后,这里建议并稍后删除的另一个好答案是将WCF服务配置为支持REST API,如下所示: http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call
答案 1 :(得分:0)
我认为您的问题可能是WCF不支持开箱即用的跨域,除非您启用CORS。
这里有一个很好的阅读解释和解决方法:http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx
另一种可能更容易的替代方法是将WebAPI放到您正在使用的任何项目中,可以很容易地在WebForms或MVC中执行此操作。
答案 2 :(得分:0)
不了解WCF Web服务,但可能是这些代码行,用于常规服务,解决您的问题
var jsonData = [YOUR JSON PARAMETER];
$.ajax({
async: false,
type: "POST",
url: [YOUR WEB SERVICE URL],
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ json: jsonData }),
dataType: "json",
success: OnSuccess,
failure: function(err) {
alert("Error : " + err.d);
}
});
function OnSuccess(data) {
alert("Success:" + data.d);
}
你可以做一件事,只需要设置Access-Control-Allow-Origin& CustomeHeaders中的Access-Control-Allow-Header是您的Web服务web.config文件。
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
如果您只想允许特定域,则可以使用域的特定值而不是*值
来实现