本次程序和上一节程序类似,只是为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>

【菜鸟学WCF】使用ScriptManager+Ajax调用WCF服务之如何为服务创建接口的更多相关文章

  1. 从Android应用程序中消耗WCF Web服务?

    我想从Android应用程序中使用WCFWeb服务.我曾经使用过.asmxweb服务,但我不知道如何在Android应用程序中使用SCFWeb服务.我用谷歌搜索它但没有找到任何东西.如果有人做过,请帮助我.提前致谢.解决方法Hereisanarticleexplaininghowtoconsumewebservicewithandroidingeneral当涉及到WCF并且可以与您想要小心的jav

  2. 具有证书的WCF客户端身份验证

    同一服务正在使用.pfx证书进行身份验证。客户端不愿意共享.pfx文件,并坚持要求我实现一种使用.cer证书的方法。我已尝试安装证书并将其导出为.pfx格式,但由于.cer文件没有私钥,因此禁用了以.pfx导出的选项。

  3. wcf – ClientCredentialType = Windows和= Ntlm之间的差异

    FeedbackID=354236这种情况听起来类似于clientCredentialType=Windows在域帐户下运行时失败,并且在本地帐户下运行时工作).问题是建议的修复程序需要更改WCF客户端配置文件–但在我的情况下,我使用SOAP1.1与非WCF客户端.clientCredentialType=Windows使用内置的Windows身份验证,可以通过ActiveDirectory和NTLM.显然,NTLM类型将仅使用NTLM进行身份验证.我相信你已经看过了,但这里是WCF安全性的链接:http

  4. 如何在1个Windows服务中托管2个WCF服务?

    我有一个WCF应用程序,它有两个服务,我试图使用net.tcp在一个Windows服务中托管.我可以运行任何一种服务,但只要我尝试将它们都放在Windows服务中,只有第一个服务加载.我已经确定第二个服务ctor正在被调用,但OnStart永远不会被激活.这告诉我WCF发现加载第二个服务有问题.使用net.tcp我知道我需要打开端口共享并启动服务器上的端口共享服务.这一切似乎都运作正常.我已经尝试

  5. windows-services – Msmq和WCF服务

    我是否遗漏了为队列和Windows服务设置的任何权限,如果是这样,你能否建议在哪里添加这些权限?汤姆·霍兰德有一个关于使用WCF的MSMQ的三部分博客系列–非常值得一试!

  6. 在带有WCF的App.config中使用Windows角色身份验证

    谢谢如果我理解得很好,你想在运行时选择角色.这可以通过WCF操作中的permission需求来完成.例如.

  7. wcf – 什么是任务管理器中的CPU时间?

    我有一些WCF服务托管在Windows服务中.昨天我看了任务管理器,注意到我的Windows服务进程的cpu时间是5个小时以上,而大多数其他进程都是0.这意味着什么?

  8. .net – 在IIS 7.5中托管WCF与Windows服务的性能注意事项

    我有一个简单直接的问题:是否有任何性能优势,我不知道什么时候比较主机的IIS7.5中的WCF服务与Windows服务?

  9. wcf – 为我配置“使用端点配置服务”演示失败(Microsoft / endpoint.tv / Pluralsight)

    HTTP无法注册URLhttp://:8732/EvalService/….:P我试过评论新的终点无济于事.即使是原始的也会因此错误而失败.如果我把它们放回原来的端口[不是那么]1337也没关系.这是App.config,并没有什么突出的问题:有什么问题/我该如何解决?

  10. 需要一步一步的WCF作为Windows服务

    我正在尝试找到一个(好的)分步创建WCF并将其作为Windows服务托管的示例.我正在使用VS2010并且有一个带有1个函数的简单WCF.请不要谷歌和发布;我正在寻找某人实际使用过的资源.我所做的大部分Google搜索都没有达到我想要做的事情.我只想获取我的WCF库,并找到一种方法将其安装为WindowService.我在2008年完成了,但2010年是……

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部