在網上查找了很多資料,90%的資料中都是在web項目中添加.SVC文件來進行的,也就是使用IIS托管的服務,
而且相關資料中也未說的很詳細,GET方法很快就調通了,POST方式卻倒騰了很久,
最后發現在很多資料中提及的腳本調用必須添加的
<behavior name="webJSBehavior">
<!--這里必須設置,允許腳本調用-->
<enableWebScript /></behavior>
根本上會阻礙POST方式的成功,花了幾天的時間才得以最終將這個Demo完成。
1.WCF服務
配置WCF服務
1.1Contract契約,其中黃色背景字部分比較重要,
namespace MyServices { [ServiceContract(Namespace = "www.yycode.net", Name = "MyTestService")] public interface IMyTestService { [OperationContract] string GetData(int value); [OperationContract] [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] string HelloWorld(); [OperationContract] [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] string GetCount(); [OperationContract]
//這里的AddOrder方法一會會使用POST方式調用,配置會稍微不同。 [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json)] string AddOrder(string OrderID); } }
1.2服務
namespace MyServices { // 注意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的類名“Service1”。 [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")] public class MyTestService : IMyTestService { public static int CountGet = 0; public string GetData(int value) { CountGet += 1; return string.Format("You entered: {0}", value); } public string HelloWorld() { CountGet += 1; return string.Format("HelloWorld {0}",DateTime.Now); } public string AddOrder(string OrderID) { return string.Format("成功新增訂單{0}",OrderID); } public string GetCount() { return string.Format("成功被調用{0}次",CountGet); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } } }
代碼“[JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")]”中的"jsoncallback"可以為其他任何字符串,在於調用服務時標識傳入的參數
1.3配置終結點App.Config,其中黃色背景里面的內容值得特別注意。
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true"/> </system.web> <!-- 部署服務庫項目時,必須將配置文件的內容添加到 主機的 app.config 文件中。System.Configuration 不支持庫的配置文件。 --> <system.serviceModel> <services> <service behaviorConfiguration="MyServices.Service1Behavior" name="MyServices.MyTestService"> <endpoint address="norml" binding="basicHttpBinding" contract="MyServices.IMyTestService"> <identity> <dns value="localhost"/> </identity> </endpoint> <!--http://127.0.0.1:9901/MyTestService/--> <endpoint address="Jweb" binding="webHttpBinding" behaviorConfiguration="webhttpBehavior" bindingConfiguration="webBinding" contract="MyServices.IMyTestService"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://127.0.0.1:90/MyServices/MyTestService/"/> </baseAddresses> </host> </service> </services> <behaviors> <endpointBehaviors> <behavior name="webJSBehavior"> <enableWebScript /> </behavior> <behavior name="webhttpBehavior"> <webHttp/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="MyServices.Service1Behavior"> <!-- 為避免泄漏元數據信息, 請在部署前將以下值設置為 false --> <serviceMetadata httpGetEnabled="True"/> <!-- 要接收故障異常詳細信息以進行調試, 請將以下值設置為 true。在部署前 設置為 false 可避免泄漏異常信息 --> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <webHttpBinding> <!--crossDomainScriptAccessEnabled指定腳本可以跨域訪問--> <binding name="webBinding" crossDomainScriptAccessEnabled="true"/> </webHttpBinding> </bindings> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="string"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> </system.serviceModel> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup> </configuration>
Winform托管WCF服務
新建winform項目,在項目中引用WCF服務類庫,下面是Winform相關主要代碼,
如何在WinForm中托管WCF服務的方式可以參考:WCF的幾種寄宿方式

void worker_DoWork(object sender, DoWorkEventArgs e) { try { serviceHost = new ServiceHost(typeof(MyTestService)); if (serviceHost.State != CommunicationState.Opened) { serviceHost.Open(); } e.Result = "正常"; } catch (Exception ex) { e.Result = ex.Message; } }
WEB端調用WCF服務
基於JQuery寫的JS文件,里面包含一個Format函數,還有二次包裝GET和POST方法
var ServiceUrl = "http://127.0.0.1:9090/MyServices/MyTestService/Jweb/{0}?jsoncallback=?"; $.format = function (source, params) { if (arguments.length == 1) return function () { var args = $.makeArray(arguments); args.unshift(source); return $.format.apply(this, args); }; if (arguments.length > 2 && params.constructor != Array) { params = $.makeArray(arguments).slice(1); } if (params.constructor != Array) { params = [params]; } $.each(params, function (i, n) { source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); }); return source; }; $.GetWCF = function (Method,CallBack) { var url1 =$.format(ServiceUrl,Method); $.ajax({ type: "GET", dataType: "json", url: url1, async:false, success: function (data, status) { CallBack(data, status); }, error: function (str, txtStatus, mes) { alert(txtStatus + mes); } }); } //OrderID $.PostWCF = function (Method,DataContent,CallBack) { var url1 = $.format(ServiceUrl, Method); $.ajax({ type: "POST",//Post方式 data: DataContent, dataType: "json", contentType: 'application/json; charset=utf-8', async: false,//非異步 url: url1, success: function (data, status) { CallBack(data, status); }, error: function (str, txtStatus, mes) { alert(txtStatus+mes); //alert(mes); } }); }
頁面代碼

<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script> <script src="Scripts/MyJquery.js"></script> <script type="text/javascript"> function AlertResult(data, status) { alert("數據:" + data + "\n狀態:" + status); } function AddMessage(data, status) { var mess=$("#Message"); mess.html($.format("{0}</br>數據:{1}狀態:{2}", mess.html(), data, status)); } function AddOrderResult(data, status) { var mess = $("#Message"); mess.html($.format("{0}</br>數據:{1}狀態:{2}", mess.html(), data.AddOrderResult, status)); } $(document).ready(function () { $("#Button1").click(function () { $.GetWCF("HelloWorld", AddMessage); $.GetWCF("GetCount", AddMessage); $.PostWCF("AddOrder",{ "OrderID": "19851221"}, AddOrderResult); }); }); </script> </head> <body> <form id="form1" runat="server"> <div> <div id="Message" style="height:100px;"> </div> <div> <input id="Button1" type="button" value="調用AJAX" /> <br /> <br /> <br /> </div> </div> </form> </body> </html>
技術交流請加群517867216 入群驗證請帶上程序員的特點。