废话不多说,以简单粗暴的方式展现出来。
一、第一步先添加一些必要代码,在实现类上面添加以下代码
//ajax请求要添加
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")] //get请求要添加
配置文件web.config添加
<bindings>
<!--get请求必须添加的-->
<webHttpBinding>
<binding name="webHttpBinding" crossDomainScriptAccessEnabled="true"/>
</webHttpBinding>
</bindings>
<services>
<!--这里是发布的service,发布了ajax才能调用,调试的service不能出现在这里-->
<service name="WcfTest.Service1" behaviorConfiguration="servicebehavior">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBinding"
name="endpoint1" contract="WcfTest.IService1" behaviorConfiguration="NewBehavior0" />
</service>
</services>
最后还要添加一个Global.asax文件,这个post请求要用的,Application_BeginRequest方法添加以下代码
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
二、ajax以GET请求调用WCF无参
1.在接口类里面添加一个方法
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string GetDataNoParams();
2.在实现类里面实现这方法
public string GetDataNoParams()
{
return "hello world!";
}
3.js代码,地址改成自己的
function getWcfNoParams() {
$.ajax({
url: "http://localhost:60570/Service1.svc/GetDataNoParams?jsoncallback=?",
type: "GET",
contentType: "application/json",
dataType: "json",
processData: true,
success: function(json) {
alert("返回结果:"+json);
$("#write").text(json);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(textStatus);
}
});
}
二、ajax以GET调用WCF(有参)
1.在接口类里面添加一个方法
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string GetData(int value, string name);
2.在实现类里面实现这方法
public string GetData(int value, string name)
{
DataTable dt = new DataTable();
dt.TableName = "Student";
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name");
dt.Columns.Add("NickName");
DataRow dr = dt.NewRow();
dr["ID"] = value;
dr["Name"] = name;
dr["NickName"] = "小三";
dt.Rows.Add(dr);
string result = "";
result = JsonConvert.SerializeObject(dt, new DataTableConverter());
return result;
}
3.js代码,地址改成自己的
function getWCF(value) {
$.ajax({
url: "http://localhost:60570/Service1.svc/GetData?jsoncallback=?&value="+ value +"",
type: "GET",
contentType: "application/json",
dataType: "json",
processData: true,
success: function(json) {
alert("返回结果:"+json);
$("#write").text(json);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(textStatus);
}
});
}
三、ajax以POST方式调用WCF(基本数据类型的参数)
1.在接口类里面添加一个方法
[OperationContract]
[WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string PostDataIntString(int value, string name);
2.在实现类里面实现这方法
public string PostDataIntString(int value, string name)
{
string text = "我是{0},年龄{1}";
return string.Format(text, name, value);
}
3.js代码,地址改成自己的
function postWCF_int_string(age,name) {
$.ajax({
type: "POST",
url: "http://localhost:60570/Service1.svc/PostDataIntString",
data: JSON.stringify({"value": age, "name": age,name}),
contentType:"application/json;charset=utf-8",
dataType: 'json',
processData:true,
success: function(json) {
alert(json);
$("#write").text(json);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(textStatus);
}
});
}
四、ajax以POST方式调用WCF(参数是对象)
1.在接口类里面添加一个方法和一个类,参数是对象,不要BodyStyle
[OperationContract] // 参数是对象,不要BodyStyle
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string PostDataObject(CompositeType composite);
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
2.在实现类里面实现这方法
public string PostDataObject(CompositeType composite)
{
return composite.StringValue;
}
3.js代码,地址改成自己的
function postWCF_object() {
$.ajax({
type: "POST",
url: "http://localhost:60570/Service1.svc/PostDataObject",
data: JSON.stringify({"BoolValue": true, "StringValue": "json数据作为参数上传"}),
contentType:"application/json;charset=utf-8",
dataType: 'json',
processData:true,
success: function(json) {
alert(json);
$("#write").text(json);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
}
五、另外顺便记录一下用C#的HttpWebRequest调用WCF代码
protected void btnSearch_Click(object sender, EventArgs e)
{
string url = "http://localhost:29851/shipping.svc/getShippingData";
string contentTypeJson = "application/json;charset=utf-8";
string jsonText = @"{""Department"": ""&&department"",""PageIndex"": 1,""PageSize"": 50}";
jsonText = jsonText.Replace("&&department", department.SelectedValue);
string text = PostHttp(url, jsonText, contentTypeJson);
}
public string PostHttp(string url, string body, string contentType)
{
string responseContent = "";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = contentType;
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = 200000;
byte[] btBodys = Encoding.UTF8.GetBytes(body);
httpWebRequest.ContentLength = btBodys.Length;
httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);
HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
responseContent = streamReader.ReadToEnd();
httpWebResponse.Close();
streamReader.Close();
httpWebRequest.Abort();
httpWebResponse.Close();
return responseContent;
}