微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【菜鸟学WCF】使用ScriptManager+Ajax调用WCF服务之如何为服务创建接口

本次程序和上一节程序类似,只是为WCF服务创建了接口。

Demo:请点击这里

直接看下代码吧。


Service1.svc.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;

namespace WebApplication1
{        
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    //这里必须写命名空间,不要空着
    [ServiceContract(Namespace = "GLM")]
    public class Service1 : IService1
    {
        // 要使用 HTTP GET,请添加 [WebGet] 特性。(认 ResponseFormat 为 Webmessageformat.Json)
        // 要创建返回 XML 的操作,
        //     请添加 [WebGet(ResponseFormat=Webmessageformat.Xml)],
        //     并在操作正文中包括以下行:
        //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";                 
        [OperationContract]     
        public string SayHello(string name)
        {
            // 在此处添加操作实现            
            return string.Format("hello,name={0}",name);
        }      
    }    
    public interface IService1
    {          
        string SayHello(string name);
    }
}


Service1.svc代码
<%@ ServiceHost Language="C#" Debug="true" Service="WebApplication1.Service1" CodeBehind="Service1.svc.cs" %>

WebForm1.aspx代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

<!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></title>
    <script type="text/javascript">
        function test() {
            var client = new GLM.Service1();
            var strName = "Jack";
            client.SayHello(strName,OnComplete,OnError);            
        }
        function OnComplete(result) {
            alert(result);
        }
        function OnError(result) {
            alert("Error");
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/Service1.svc" />
        </Services>
    </asp:ScriptManager>
    <div>        
    <input id="button1" type="button" value="click" onclick="test();" />
    </div>
    </form>
</body>
</html>


问题来了,我们添加的服务是“启用了Ajax的WCF服务”,在Service1.svc。cs文件中,[OperationContract]和[ServiceContract]必须放在类定义上,不能放在接口上,不知道为什么,以上实例代码运行正常。有哪位大神知道原因,请指教,谢了。


好吧,问题已经解决,刚才查看了以下配置文件,发现问题所在了,如果想将OperationContract和ServiceContract用在接口上,必须修改配置文件的endPoint节点的contract属性,该节点原来是这样的:

<services>
            <service name="WebApplication1.Service1">
                <endpoint address="" behaviorConfiguration="WebApplication1.Service1AspNetAjaxBehavior"
                    binding="webHttpBinding" contract="WebApplication1.Service1" />
            </service>
        </services>

修改成这样就OK了:
<services>
            <service name="WebApplication1.Service1">
                <endpoint address="" behaviorConfiguration="WebApplication1.Service1AspNetAjaxBehavior"
                    binding="webHttpBinding" contract="WebApplication1.IService1" />
            </service>
        </services>

现在,Service1.svc.cs文件就是这样了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;

namespace WebApplication1
{        
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]    
    public class Service1 : IService1
    {
        // 要使用 HTTP GET,请添加 [WebGet] 特性。(认 ResponseFormat 为 Webmessageformat.Json)
        // 要创建返回 XML 的操作,
        //     请添加 [WebGet(ResponseFormat=Webmessageformat.Xml)],
        //     并在操作正文中包括以下行:
        //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";                 
        public string SayHello(string name)
        {
            // 在此处添加操作实现            
            return string.Format("hello,name);
        }      
    }
    //这里必须写命名空间,不要空着
    [ServiceContract(Namespace = "GLM")]
    public interface IService1
    {
        [OperationContract]       
        string SayHello(string name);
    }
}

注意在WebForm1.aspx中调用服务的时候,要修改成:

<script type="text/javascript">
        function test() {
            var client = new GLM.IService1();//看这里
            var strName = "Jack";
            client.SayHello(strName,OnError);            
        }
        function OnComplete(result) {
            alert(result);
        }
        function OnError(result) {
            alert("Error");
        }
    </script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐