use*_*827 2 ajax asp.net-mvc wcf
我有两个应用程序.第一个是WCF服务,第二个是asp.net MVC 3应用程序.
在WCF应用程序中,我有一个界面:
[ServiceContract]
public interface IService1
{
[OperationContract]
string HelloWorld(string personName);
}
Run Code Online (Sandbox Code Playgroud)
一节课:
public class Service1 : IService1
{
public string HelloWorld(string personName)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize("Hello " + personName);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在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>
Run Code Online (Sandbox Code Playgroud)
但是在Firebug中我得到了错误:400 Bad Request.
如何HelloWorld正确调用方法?谢谢.
VJA*_*JAI 12
所以你试图从JavaScript中使用WCF服务?
我看到的第一个问题是,您的服务尚未准备好从JavaScript中使用:(.您必须进行以下更改..
Service1使用AspNetCompatibilityRequirements行为配置类.
HelloWorld在与WebGet属性的接口中标记服务方法.[你需要参考System.SericeModel.Web装配]
做了两个改变之后..
[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 });
}
}
Run Code Online (Sandbox Code Playgroud)
下一个..
配置webHttpBinding服务(确保更改服务和合同名称!).
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJsonP" />
</webHttpBinding>
</bindings>
<services>
<service name="MvcApplication3.Service1">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJsonP"
contract="MvcApplication3.IService1"
behaviorConfiguration="webHttpBehavior"/>
</service>
</services>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)所以现在服务准备好了!
让我们在客户端进行更改(你从服务中获取一些数据,为什么要POST?)
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
url: "http://localhost:50623/Service1.svc/HelloWorld",
type: "GET",
contentType: "application/json; charset=utf-8",
data: dataIn,
dataType: "json",
success: function (data) {
var jsonData = JSON.parse(data);
$("#response").html(jsonData.text);
},
error: function (error) {
alert("Error: " + error);
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已假设WCF服务和MVC应用程序都在同一个域中运行.
但如果情况并非如此,那么由于CROSS-DOMAIN BARRIER,您将发出405(Method Not Allowed)错误.
有不同的方法来克服这个问题!
1.使用JSONP
在这种情况下,您必须将crossDomainScriptAccessEnabled属性设置为true绑定,并且必须从jQuery进行JSONP调用.
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
Run Code Online (Sandbox Code Playgroud)
然后将dataTypefrom "json"改为" jsonp"in the $.ajaxmethod.
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
...
dataType: "jsonp",
...
});
</script>
Run Code Online (Sandbox Code Playgroud)
2.使用CORS
请参考..
https://developer.mozilla.org/en/http_access_control
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |