JQuery使用$.ajax跨域調用winform托管的WCF服務(原創)


在網上查找了很多資料,90%的資料中都是在web項目中添加.SVC文件來進行的,也就是使用IIS托管的服務,

而且相關資料中也未說的很詳細,GET方法很快就調通了,POST方式卻倒騰了很久,

最后發現在很多資料中提及的腳本調用必須添加的

<behavior name="webJSBehavior">
<!--這里必須設置,允許腳本調用-->
<enableWebScript /></behavior>

根本上會阻礙POST方式的成功,花了幾天的時間才得以最終將這個Demo完成。

1.WCF服務

2.Winform托管WCF服務

3.WEB端調用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的幾種寄宿方式

View Code
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);
        }
    });
}

 

頁面代碼

View Code
<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 入群驗證請帶上程序員的特點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM