Javascript 调用自宿主WCF(invoke self hosted wcf from js/ajax)

 

Javascript 调用自宿主WCFinvoke self hosted wcf from js/ajax)

ASP.NetMS已经集成了WCF方式的WebService,这样利用Ajax Enabled WCf就可以轻松的实现JS调用WCf功能。

但是在某些特定环境下(例如WebGame后台服务器程序)我们需要利用JS直接调用非IIS宿主的WCF服务,如果你Google过,就会发现在网上找到的大多数方案都是利用ASP.NET充当一个代理(先利用ASP.NET调用一次,再在ASP.NET网站中封装一下,以便JS调用)。这样做的好处是可以解决跨域访问的问题,并且调用起来也挺简单的。

下面,我们通过实例来说明如何利用JS直接调用非IIS宿主的WCFJS调用WCF无非要解决两个问题,1.如何获取JS代理类,2.如何解决跨域问题。今天主要解决第1个问题,关于跨域问题会在后面的文章中加以解决(利用JSONP)。

1.        建立一个自宿主WCFself hosted wcf

建立一个WCf服务器,其中包括一个函数,如下所示:

namespace WCFTest

{

    [ServiceContract]

    public interface IService1

    {

        [OperationContract]

        string GetHello(string uid);

    }

    public class Service1 : IService1

    {

 

        #region IService1 Members

 

        public string GetHello(string uid)

        {

            return "hello " + uid;

        }

 

        #endregion

    }

}

2.        在一个Windows窗口程序中启动该服务器,代码如下:

private void Form1_Load(object sender, EventArgs e)

        {

            ServiceHost host = new ServiceHost(typeof (Service1));

            host.Open();

        }

 

3.        App.config中查看该WCF的网址,并运行主程序

4.        在浏览器打开WCF的网站,如下图所示:

 

height=345

 

大家知道,如果在ASP.NET中添加WCF模板,IDE会自动为我们生成一个svc文件,而JS的代理类正是通过这个SVC文件得到的,但是在刚才生成的WCF中是无法得到SVC文件以及JS的代理类的,这样就无法被JS所调用,如何解决呢?让我们先来看一下在ASP.NET中添加了一个WCF后,Web.Config是如何配置的,如下所示:

<system.serviceModel>

        <behaviors>

            <endpointBehaviors>

                <behavior name="ServiceAspNetAjaxBehavior">

                    <enableWebScript />

                < font>behavior>

            < font>endpointBehaviors>

        < font>behaviors>

        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"

            multipleSiteBindingsEnabled="true" />

        <services>

            <service name="Service">

                <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior"

                    binding="webHttpBinding" contract="Service" />

            < font>service>

        < font>services>

    < font>system.serviceModel>

关键就在于该服务绑定了webHttpBinding,并且在其行为中(ServiceAspNetAjaxBehavior启用了EnableWebScript

再看一下刚才那个WCF程序的App.Config文件,如下所示:

<system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceDebug includeExceptionDetailInFaults="false" />

                < font>behavior>

            < font>serviceBehaviors>

        < font>behaviors>

        <services>

            <service name="WCFTest.Service1">

                <endpoint address="" binding="wsHttpBinding" contract="WCFTest.IService1">

                    <identity>

                        <dns value="localhost" />

                    < font>identity>

                < font>endpoint>

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFTest/Service1/" />

                    < font>baseAddresses>

                < font>host>

            < font>service>

        < font>services>

    < font>system.serviceModel>

并不难发现该WCF服务使用的是wsHttpBinding, 参照ASP.NET中的WCf将该WCF的配置文件进行修改,修改后如下所示:

<system.serviceModel>

        <behaviors>

          <endpointBehaviors  >

            <behavior name ="MyBehavior">

              <enableWebScript/>

            < font>behavior>

          < font>endpointBehaviors>

            <serviceBehaviors>

                <behavior name="">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceDebug includeExceptionDetailInFaults="false" />

                < font>behavior>

            < font>serviceBehaviors>

        < font>behaviors>

        <services>

            <service name="WCFTest.Service1">

                <endpoint address="" binding="wsHttpBinding" contract="WCFTest.IService1">

                    <identity>

                        <dns value="localhost" />

                    < font>identity>

                < font>endpoint>

            < contract="WCFTest.IService1" binding="webHttpBinding">

                        address ="http://localhost/WCFTest"

                         behaviorConfiguration ="MyBehavior"

                        >

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFTest/Service1/" />

                    < font>baseAddresses>

                < font>host>

            < font>service>

        < font>services>

注意,这里是添加了一个EndPoint,并将其使用的协议设置为WebHttpBinding(如加粗位置所示),当然这里也体现出WCF可以多协议绑定的方便之处。

现在可以尝试启动该WCF服务了,启动之后,输入如下网址:http://localhost/WCFTest/js,浏览器便会提示下载一个JS文件(没有扩展名的),如下图所示:

 

height=224

 

有了前面的准备,我们就可以在相同的域内(IP相同,端口也要相同)访问非IISWCF了。过程如下:

1.        寻立一个ASP.NET网站

2.        在页面中添加一个ScriptManager,基代码如下:

<asp:ScriptManager ID="ScriptManager1" runat="server">

            <Scripts>

                <asp:ScriptReference Path="http://localhost/WCFTest/js" />

            < font>Scripts>

        < font>asp:ScriptManager>

3.        添加JS代码以及HTML代码来完善功能

页面代码如下所示:

@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>< font>title>

    <script language="javascript" type="text/javascript">

//

 

        function Button1_onclick() {

            var userName = $get("Text1").value;

            tempuri.org.IService1.GetHello(userName, function (result) {

                alert(result );

            });

        }

 

// ]]>

    < font>script>

< font>head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:ScriptManager ID="ScriptManager1" runat="server">

            <Scripts>

                <asp:ScriptReference Path="http://localhost/WCFTest/js" />

            < font>Scripts>

        < font>asp:ScriptManager>

        <input id="Text1" type="text" /><input id="Button1" type="button"

            value="button" onclick="return Button1_onclick()" />< font>div>

    < font>form>

< font>body>

< font>html>

 

4.        运行结果,如下所示:

 

height=302

转载于:https://www.cnblogs.com/warensoft/archive/2010/03/07/1680313.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值