从asp.net mvc对wcf的ajax调用
我有两个应用程序。第一个是WCF服务,第二个是asp.net MVC 3应用程序。从asp.net mvc对wcf的ajax调用,ajax,asp.net-mvc,wcf,Ajax,Asp.net Mvc,Wcf,我有两个应用程序。第一个是WCF服务,第二个是asp.net MVC 3应用程序。 在WCF应用程序中,我有一个界面: [ServiceContract] public interface IService1 { [OperationContract] string HelloWorld(string personName); } 还有一节课: public class Service1 : IService1 {
在WCF应用程序中,我有一个界面:
[ServiceContract]
public interface IService1
{
[OperationContract]
string HelloWorld(string personName);
}
还有一节课:
public class Service1 : IService1
{
public string HelloWorld(string personName)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize("Hello " + personName);
}
}
现在,在asp.net mvc应用程序中,我想通过Ajax调用此方法:
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
url: "http://localhost:7215/Service1.svc/HelloWorld",
type: "POST",
contentType: "application/json; charset=utf-8",
data: dataIn,
dataType: "json",
success: function (data) {
var object = JSON.parse(data.d);
if (object.Error == '') {
$("#response").html(object);
}
},
error: function (error) {
alert("Error: " + error);
}
});
</script>
var personName=“John”;
var dataIn='{'+'“输入”:“'+personName+'“}”;
$.ajax({
url:“http://localhost:7215/Service1.svc/HelloWorld",
类型:“POST”,
contentType:“应用程序/json;字符集=utf-8”,
数据:数据输入,
数据类型:“json”,
成功:功能(数据){
var object=JSON.parse(data.d);
如果(object.Error==''){
$(“#响应”).html(对象);
}
},
错误:函数(错误){
警报(“错误:+错误”);
}
});
但是在Firebug中我得到了错误:400错误请求
如何正确调用
HelloWorld
方法?
谢谢。您需要确保的第一件事是您没有违反内置浏览器的。此策略防止您发送跨域AJAX请求。由于您提到您有两个应用程序,我怀疑您达到了这个限制,因为您有第一个应用程序托管在
http://localhost:1234/
(包含javascript文件的文件),并且您正试图向http://localhost:7215/
(违反了相同域、不同端口=>相同源策略)
有几种。其中一种是将服务配置为发送响应而不是JSON。下面是MSDN上的一个示例,说明了如何配置它。基本上,您需要启用
crossDomainScriptAccessEnabled
开关,如中所示。那么您正试图从JavaScript使用WCF服务吗
我看到的第一个问题是,您的服务尚未准备好从JavaScript中使用:(。您必须进行以下更改
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string HelloWorld(string personName);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
public string HelloWorld(string personName)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// you are not returning data in proper JSON format, wrap the text in
// an anonymous object before serializing.
return serializer.Serialize(new { text = "Hello " + personName });
}
}
AspNetCompatibilityRequirements
行为配置Service1
类WebGet
属性的界面中标记服务方法HelloWorld
。
[您需要参考System.seriemodel.Web
assembly][ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string HelloWorld(string personName);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
public string HelloWorld(string personName)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// you are not returning data in proper JSON format, wrap the text in
// an anonymous object before serializing.
return serializer.Serialize(new { text = "Hello " + personName });
}
}
接下来
webHttpBinding
(确保更改服务和合同名称!)
然后在$.ajax
方法中将数据类型从“json”
更改为“jsonp”
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
...
dataType: "jsonp",
...
});
</script>
var personName=“John”;
var dataIn='{'+'“输入”:“'+personName+'“}”;
$.ajax({
...
数据类型:“jsonp”,
...
});
2.使用CORS
参考这个
哇,回答得很好。非常感谢。我还有一个问题。我有ASP.NET MVC应用程序中的几种方法,可以从外部win(而不是我的)应用程序(通过tcp/ip)检索数据。现在我想将这些方法移到WCF服务,以及其他方法(发送电子邮件和其他进程,它们现在在单独的线程中运行)。这是我第一次使用web服务/wcf。还有,更好的方法是什么:wcf、web服务、win service?ThanksI建议将此作为一个单独的问题发布。我发现这个答案有助于我使用JavaScript+wcf。不过有一件事是:dataIn
JSON值对我不起作用。我需要替换它使用var dataIn=“input=“+personName;”
并取出contentType:…
。这使得它返回JSON,但仍然需要querystring输入。Hi@Mark我面临同样的问题,但只有在抛出异常时才遇到。我无法看到从WCF服务中抛出的实际异常。
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
...
dataType: "jsonp",
...
});
</script>