• 如何创建一个AJAX-Enabled WCF Service


    原创地址:http://www.cnblogs.com/jfzhu/p/4041638.html

    转载请注明出处

    前面的文章中介绍过《Step by Step 创建一个WCF Service 》以及《如何使用WCF的Trace与Message Log功能》,本文介绍如何创建一个AJAX-Enabled WCF Service。

    (一)创建一个WCF AJAX-enabled service

    1. 打开Visual Studio 2012,创建一个ASP.NET Empty Web Application Project,命名为SandwichServices。这时Visual Studio的web.config文件内容为:

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
    </configuration>

    2. 添加一个AJAX-enabled WCF Service,命名为CostService.svc

    using System.ServiceModel;
    using System.ServiceModel.Activation;
    
    namespace SandwichServices
    {
        [ServiceContract(Namespace = "SandwichServices")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class CostService
        {
            // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
            // To create an operation that returns XML,
            //     add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
            //     and include the following line in the operation body:
            //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
            [OperationContract]
            public void DoWork()
            {
                // Add your operation implementation here
                return;
            }
            
        }
    }


    因为我们不打算使用TCP等HTTP之外的Protocol,所以设置为AspNetCompatibilityEnabled。

    3. 修改Namespace ServiceContractAttribute,并添加一个CostOfSandwiches方法

    using System.ServiceModel;
    using System.ServiceModel.Activation;
    
    namespace SandwichServices
    {
        [ServiceContract(Namespace = "SandwichServices")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class CostService
        {
            // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
            // To create an operation that returns XML,
            //     add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
            //     and include the following line in the operation body:
            //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
            [OperationContract]
            public void DoWork()
            {
                // Add your operation implementation here
                return;
            }
    
            [OperationContract]
            public double CostOfSandwiches(int quantity)
            {
                return 1.25 * quantity;
            }
        }
    }

    4. 这时Visual Studio生成的web.config文件

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="SandwichServices.CostServiceAspNetAjaxBehavior">
              <enableWebScript />
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
        <services>
          <service name="SandwichServices.CostService">
            <endpoint address="" behaviorConfiguration="SandwichServices.CostServiceAspNetAjaxBehavior"
                binding="webHttpBinding" contract="SandwichServices.CostService" />
          </service>
        </services>
      </system.serviceModel>
    </configuration>

    如果在浏览器中访问CostService.svc,得到如下错误

    Untitled

    5. 修改web.config文件

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="SandwichServices.CostServiceAspNetAjaxBehavior">
              <enableWebScript />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="SandwichServices.CostServiceServiceBehavior" >
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
        <services>
          <service name="SandwichServices.CostService" behaviorConfiguration="SandwichServices.CostServiceServiceBehavior">
            <endpoint address="" behaviorConfiguration="SandwichServices.CostServiceAspNetAjaxBehavior"
                binding="webHttpBinding" contract="SandwichServices.CostService" />
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
          </service>
        </services>
      </system.serviceModel>
    </configuration>

    再次在浏览器中打开CostService.svc,可以正常访问了。

    image

    (二)创建Client端,调用WCF Service

    1. 创建一个aspx Page

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebClient.WebForm2" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script language="javascript" type="text/javascript">
            function Button1_onclick() {
                var service = new SandwichServices.CostService();
                service.CostOfSandwiches(3, onSuccess, null, null);
            }
    
            function onSuccess(result) {
                alert(result);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <p>
            <input id="Button1" type="button" value="Price for 3 Sandwiches" onclick="return Button1_onclick()" />
            </p>
        </div>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
                <Services>
                    <asp:ServiceReference Path="http://192.168.6.47:8080/CostService.svc" />
                </Services>
            </asp:ScriptManager>
        </form>
    </body>
    </html>

    2. 在浏览器中打开该页面,然后用F12工具可以看到加载进来的JavaScript,是WCF Service生成的。

    image

    Fiddler

    image

    3. 点击按钮调用WCF Service

    image

    image

    (三) 总结

    WCF Service的配置文件中的endpoint的binding要使用webHttpBinding,endpointBehavior要设置成enableWebScript。

    WebForm中要在ScriptManager中添加WCF Service的引用。

  • 相关阅读:
    git .gitignore不生效的解决方法
    python 爬虫中常需要睡眠防止被封IP time sleep
    Python 实现字典操作详解
    Python遍历字典到列表中出现覆盖前面数据或者字典对值(值为列表)赋值出现重复的问题
    小红书app之shield 逆向
    淘宝h5 页面 sign加密算法
    jemter-base64加密
    Python 中更优雅的日志记录方案
    logging再学习
    elasticsearch中must和should条件同时满足
  • 原文地址:https://www.cnblogs.com/jfzhu/p/4041638.html
Copyright © 2020-2023  润新知