webabcd - 专注于asp.net, Silverlight

ASP.NET
从现在开始 一切都不晚
posts - 205, comments - 5701, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[索引页]
[源码下载]


化零为整WCF(1) - 不能免俗,我也从Hello开始


作者:webabcd


介绍
WCF(Windows Communication Foundation) - 废话不多说,俗也不能免,我也从Hello开始


示例
1、服务
IHello.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;

namespace WCF.ServiceLib.Sample
{
    
/// <summary>
    
/// IHello接口
    
/// </summary>

    [ServiceContract]
    
public interface IHello
    
{
        
/// <summary>
        
/// 打招呼方法
        
/// </summary>
        
/// <param name="name">人名</param>
        
/// <returns></returns>

        [OperationContract]
        
string SayHello(string name);
    }

}

Hello.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;

namespace WCF.ServiceLib.Sample
{
    
/// <summary>
    
/// Hello类
    
/// </summary>

    public class Hello : IHello
    
{
        
/// <summary>
        
/// 打招呼方法
        
/// </summary>
        
/// <param name="name">人名</param>
        
/// <returns></returns>

        public string SayHello(string name)
        
{
            
return "Hello: " + name;
        }

    }

}


2、宿主
Hello.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Sample.Hello" %>

Web.config
<?xml version="1.0"?>
<configuration>
  
<system.serviceModel>
    
<behaviors>
      
<serviceBehaviors>
        
<behavior name="SampleBehavior">
          
<!--httpGetEnabled - 使用get方式提供服务-->
          
<serviceMetadata httpGetEnabled="true" />
        
</behavior>
      
</serviceBehaviors>
    
</behaviors>
    
<services>
      
<!--name - 提供服务的类名-->
      
<!--behaviorConfiguration - 指定相关的行为配置-->
      
<service name="WCF.ServiceLib.Sample.Hello" behaviorConfiguration="SampleBehavior">
        
<!--address - 服务地址-->
        
<!--binding - 通信方式-->
        
<!--contract - 服务契约-->
        
<endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.Sample.IHello" />
      
</service>
    
</services>
  
</system.serviceModel>
</configuration>


3、客户端
Hello.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Hello.aspx.cs"
    Inherits
="Sample_Hello" Title="不能免俗,我也从Hello开始" 
%>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    
<asp:TextBox ID="txtName" runat="server" Text="webabcd" />
    
&nbsp;
    
<asp:Button ID="btnSayHello" runat="server" Text="Hello" OnClick="btnSayHello_Click" />
</asp:Content>

Hello.aspx.cs
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class Sample_Hello : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }


    
protected void btnSayHello_Click(object sender, EventArgs e)
    
{
        Sample.HelloClient proxy 
= new Sample.HelloClient();

        Page.ClientScript.RegisterStartupScript(
            
this.GetType(),
            
"js",
            
string.Format("alert('{0}')", proxy.SayHello(txtName.Text)),
            
true);

        proxy.Close();
    }

}


Web.config
<?xml version="1.0"?>
<configuration>
  
<system.serviceModel>
    
<client>
      
<!--address - 服务地址-->
      
<!--binding - 通信方式-->
      
<!--contract - 服务契约-->
      
<endpoint address="http://localhost:3502/ServiceHost/Sample/Hello.svc" binding="basicHttpBinding" contract="Sample.IHello" />
    
</client>
  
</system.serviceModel>
</configuration>


运行结果:
单击"btnSayHello"后弹出提示框,显示"Hello: webabcd"


OK
[源码下载]

Feedback

#1楼   回复  引用    

2007-12-05 22:17 by 黑白[未注册用户]
早就想学这个了,不过看了很多资料都看不懂
希望兄弟的这个能好懂些
先下来看看

#2楼   回复  引用    

2007-12-05 23:55 by ivw[未注册用户]
呵呵,终于有新文章出了,你的运行环境是VS08吗?

#3楼[楼主]   回复  引用  查看    

2007-12-06 08:03 by webabcd      
@黑白
:)
大家多交流

@ivw
:)
是地

#4楼   回复  引用  查看    

2007-12-06 16:53 by 迷失、伤心浪子      
VS2005打不开!!!!!!!!

#5楼   回复  引用    

2007-12-06 20:48 by 黑白[未注册用户]
@迷失、伤心浪子
要用vs2008

另外有个问题请教一下webabcd
我照着你的例子从新写了一遍
可是我的系统生成的代理类是Hello.Hello
而你的是Hello.HelloClient

兄弟知道是为什么吗?

#6楼[楼主]   回复  引用  查看    

2007-12-07 08:07 by webabcd      
@迷失、伤心浪子
用vs2008写的

@黑白
添加引用的时候选择添加服务引用,而不是web引用

#7楼   回复  引用  查看    

2007-12-07 16:09 by Clingingboy      
这个blog资源不错,关于wcf的,http://www.rainsts.net/" target="_new">http://www.rainsts.net/.
可参考下

#8楼[楼主]   回复  引用  查看    

2007-12-07 20:28 by webabcd      
@Clingingboy
:)
正愁不知道怎么往下走呢
谢谢兄弟了

#9楼   回复  引用  查看    

2007-12-10 11:42 by seabluescn      
能否请楼主写点比Hello还要基础一点的东西呢?比如,什么是WCF,有什么用?解决哪些以前很难解决的问题?在整个技术开发框架内WCF充当什么角色?有什么样的应用前景,等等。谢谢!

#10楼[楼主]   回复  引用  查看    

2007-12-10 16:20 by webabcd      
@seabluescn
:)
兄弟说的那些网上已经有好多介绍了,我觉得以我的水平不可能比他们说的更清楚

#11楼   回复  引用    

2007-12-12 13:28 by ivw[未注册用户]
兄弟,window.open打开指定大小的窗口,然后在页面里用document.body.offsetHeight来取窗口高度,如果把窗口最大化了或把窗口缩小取出来的值还是window.open时设定的大小。有试过这问题吗?

#12楼[楼主]   回复  引用  查看    

2007-12-12 17:42 by webabcd      
@ivw
我试了一下,没问题啊
offsetHeight取的值没问题

#13楼   回复  引用    

2007-12-13 08:31 by ivw[未注册用户]
不会吧,怎么我在onlod里设置获取他的高度,最大化了但还是弹出来时的大小呢。奇怪

#14楼[楼主]   回复  引用  查看    

2007-12-14 07:55 by webabcd      
@ivw
我试了一下
<body onload="alert(document.body.offsetHeight)">

</body>

没问题啊

#15楼   回复  引用    

2007-12-14 10:38 by ivw[未注册用户]
真奇怪啊。。我换了第二种方法都没问题。哎。。。。。。。

有个问题请问你,<img src="/test/1.gif" />
像上面那样,怎样可以得到虚拟目录的根目录啊?上面它返回到网站的根目录了,有没有办法指向虚拟目录的根目录啊?

#16楼[楼主]   回复  引用  查看    

2007-12-14 14:41 by webabcd      
@ivw
这样肯定是根目录的

如果要指向虚拟目录的根目录的话,可以在cs代码里写

#17楼   回复  引用    

2007-12-16 23:47 by ivw[未注册用户]
但如果是在CS里做的话那就很不方便啊,如果那是一个HTML文件那怎么办啊?有没有办法像CS代码里的 ~ 那样直接指向虚拟目录的根目录啊?或其它办法也行。

#18楼[楼主]   回复  引用  查看    

2007-12-17 00:39 by webabcd      
@ivw
那就只能走相对路径了,不同的目录就类似../这样去找了
其实线上的环境很少用虚拟目录的,绝大多数都是虚拟主机

#19楼   回复  引用    

2007-12-17 08:33 by ivw[未注册用户]
但这种问题也经常会出现,例如我做了个控件,但它里面调用了一些图片之类的资源,如果不能得到根目录去定位那就很麻烦了,要每次都去修改所有的路径

#20楼[楼主]   回复  引用  查看    

2007-12-17 10:41 by webabcd      
@ivw
以图片为例
固定图片都在css里写
动态加载的图片都在.cs文件里写
就ok了

#21楼   回复  引用    

2007-12-17 17:08 by ivw[未注册用户]
如果动态的图片太多那这种方法就不好了。:(

#22楼[楼主]   回复  引用  查看    

2007-12-18 08:11 by webabcd      
@ivw
只能这样了
个人感觉需要指定虚拟目录的根目录的话
Page.ResolveUrl
是最好的办法

#23楼   回复  引用  查看    

2008-03-12 10:09 by 北漂浪子      
请问楼主用的是VS2008那个版本,我用的express版本,功能太少,只能打开和新建Website,不能新建和打开项目,想添加一个Class Library都不可以,痛苦。

#24楼[楼主]   回复  引用  查看    

2008-03-12 15:47 by webabcd      
@北漂浪子
:)
下个完全版吧

早晚要用的啊

#25楼   回复  引用  查看    

2008-03-12 16:15 by 北漂浪子      
我在Microsoft网站上找了,有专业版的(试用期90天),你能不能给我提供一下完全版的下载链接,最好不是试用的。

#26楼[楼主]   回复  引用  查看    

2008-03-12 20:18 by webabcd      
@北漂浪子
:)
我的也是试用期90天,除了有时间限制外和正式版没区别,用那个key(网上可以搜索到)注册一下就是正式版了

#27楼   回复  引用  查看    

2008-06-05 10:48 by Howard Queen      
从今天起耐心、细心学习 wcf,从每篇文章看起;howard 到此一读。

#28楼[楼主]   回复  引用  查看    

2008-06-05 14:51 by webabcd      
@Howard Queen
:)
多看看不同的人写的东西,会收获更多的

#29楼   回复  引用    

2008-08-06 15:40 by microsoft_sun[未注册用户]
新手看你这个犯迷糊啊,我摸索了好一下才能跑出来

#30楼[楼主]   回复  引用  查看    

2008-08-06 17:14 by webabcd      
@microsoft_sun
:)
呵呵,好多人都这么说过

我写的东西,代码较多,需要说明的基本上都写在代码注释里

从来没接触过的,确实是很难理解

#31楼   回复  引用  查看    

2008-11-16 17:35 by mythzz      
开始学wcf

#32楼[楼主]   回复  引用  查看    

2008-11-17 08:10 by webabcd      
@mythzz
:)
加油
大家多交流

#33楼   回复  引用  查看    

2008-11-25 11:40 by 鬼鬼      
WCF项目编译完是一个DLL..其它项目调用为何用要"添加服务引用"而不是"添加引用"?

"添加服务引用"是指代一个URL..此URL如何取得?

#34楼   回复  引用  查看    

2008-11-25 11:48 by 鬼鬼      
啊哦..不好意思..偶建成WCF服务库啦

#35楼[楼主]   回复  引用  查看    

2008-11-25 12:19 by webabcd      
@鬼鬼
。。。
呵呵,看来问题自己解决了,哈

#36楼   回复  引用  查看    

2008-12-17 09:12 by 寻梦E.net      
我运行hello.aspx时。发生如下错误:

“System.InvalidOperationException”类型的异常在 System.ServiceModel.dll 中发生,但未在用户代码中进行处理

其他信息: 无法加载协定为“Sample.IHello”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。

不知是什么原因??

#37楼[楼主]   回复  引用  查看    

2008-12-17 12:17 by webabcd      
@寻梦E.net
是用我提供的Demo测试的吗,我都测试过的,没问题的

还是你自己写的例子?
看异常信息,是endpoint上的contract配置不正确

#38楼   回复  引用    

2008-12-21 06:27 by imnobody[未注册用户]
@webabcd
--引用--------------------------------------------------
webabcd: @寻梦E.net
是用我提供的Demo测试的吗,我都测试过的,没问题的

还是你自己写的例子?
看异常信息,是endpoint上的contract配置不正确
--------------------------------------------------------
我也碰到这个问题,麻烦帮忙看下http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?wsdl的客户端调用应该如何设置

我程序中相关代码如下:
==================================================
ServiceReference2.TranslatorWebServiceSoap service1 =
new ServiceReference2.TranslatorWebServiceSoapClient("wsdl");
string[] str = service1.getEnCnTwoWayTranslator("hello");
==================================================
然后出现错误提示和@寻梦E.net一样,劳驾!

#39楼   回复  引用    

2008-12-21 06:28 by imnobody[未注册用户]
btw,我在winform中进行调用

#40楼   回复  引用    

2008-12-21 15:37 by imnobody[未注册用户]
我知道了,是config文件中配置了多个终端节点,其实错误提示已经说了

#41楼[楼主]   回复  引用  查看    

2008-12-22 07:46 by webabcd      
@imnobody
:)
是啊

#42楼   回复  引用    

2009-06-01 15:39 by 淡淡的[未注册用户]
是什么地方多的呢,我怎么找不到啊。。

#43楼   回复  引用    

2009-06-01 17:52 by 淡淡的[未注册用户]
谁能给做个详细点的解答吗?不胜感激。。。

#44楼[楼主]   回复  引用  查看    

2009-06-01 18:30 by webabcd      
@淡淡的
没太明白你的意思,能说详细点吗?

#45楼   回复  引用    

2009-06-11 18:59 by CSdong
例子很不错,是从web的例子开始的,这样感觉能让初学者很容易懂,但是我还是希望在例子中有相应的说明或注释,这样可以让初学者更容易懂!提各位初学者谢谢你!

#46楼   回复  引用    

2009-06-11 21:52 by CSdong
请问你那个宿主是怎么建的,.svc文件

#47楼[楼主]   回复  引用  查看    

2009-06-12 07:46 by webabcd      
@CSdong
vs中在web项目中选择添加wcf服务就行

另外,如果初学的话,建议看一些入门的视频,那就很易懂了



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 983453




相关文章:

相关链接: