所以你正试图从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 });
}
}
下一个..
为服务配置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>
所以现在服务准备好了!
让我们在客户端进行更改(您正在从服务中获取一些数据,那么为什么要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>
到目前为止,我假设 WCF 服务和 MVC 应用程序都在同一个域中运行。
但如果不是这种情况,那么由于CROSS-DOMAIN BARRIER ,您将收到405
(Method Not Allowed)错误。
有不同的方法可以解决这个问题!
1.使用JSONP
在这种情况下,您必须在绑定中将crossDomainScriptAccessEnabled
属性设置为true
,并且您必须从 jQuery 进行 JSONP 调用。
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
然后将方法中的dataType
from更改"json"
为 " 。jsonp"
$.ajax
<script type="text/javascript">
var personName = "John";
var dataIn = '{' + '"input":"' + personName + '"}';
$.ajax({
...
dataType: "jsonp",
...
});
</script>
2. 使用 CORS
参考这个..
http://www.w3.org/TR/cors/
https://developer.mozilla.org/en/http_access_control