求教WCF中如何给 给 契约 和 服务类 传递参数

raynors 2018-07-14 03:55:36
基本看网上例子服务都是如下开启方式 简单服务类CalculatorService


using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
host.Opened += (s, e) => Console.WriteLine("service is running...");
host.Open();
//Console.ReadLine();
}


初学WCF,可能是概念搞错了,但也没心思沉下去翻大头书。我想知道 这个CalculatorService 类如何传参数进去。


public class CalculatorService:ICalculator
{
public double Add(double x, double y)
{
return x + y;
}

//我想在这里写个验证函数
//定义一个变量 clients=new list<clientinfo>
// 这个clients 如果不在类里面定义,那么如何传参进来,如果在类里面定义,又如何被外部引用? 除了静态变量
public bool verify(string pass )
{ 对 clients 进行操作 }
}


譬如说我想建立一个客户列表对象 list<clientinfo>(非静态)来做密码验证

这个客户列表如果建在CalculatorService 类里面,我如何取出来?又如果我建立在外面,又如何传递进去被CalculatorService类所引用?

=================另外

由CALLBACK 引发的客户端消息,可以直接messagebox,也可以直接写控制台消息,但如何把这个消息给发送到前台form? 我在网上翻到个例子,竟然是用sendmessage API来做,有其他办法么?

5: class CalculateCallback:ICallback
6: {
7:
8: public void DisplayResult(double x, double y, double result)
9: {
10: Console.WriteLine("x + y = {2} when x = {0} and y = {1}", x, y, result);
11: }
12: }

...全文
534 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂野的小强 2020-10-14
  • 打赏
  • 举报
回复
你问这些问题,不是技术问题,是你经验不足导致的。 其实你的问题蛮简单的,就是内存数据如何布局。 但是你描述的,不一定是你想要的,所以大家很难回答你。
datafansbj 2020-10-14
  • 打赏
  • 举报
回复
很简单,将这个外部类生成的实例通过参数传递到 WCF 契约函数即可。前提是 WCF 契约需要引用这个外部类的定义。其实 WCF 是一种框架,不建议在契约中对实际应用的类定义进行引用,因为耦合机制方向反了(虽然网上千篇一律地这样做)。另外 WCF 比较繁琐,还有些小 bug,我们已经打算放弃这个框架了。

至于如果将 callback 的信息进行界面展示,请参考事件(或委托)处理机制。
achilise 2020-10-14
  • 打赏
  • 举报
回复
说得太对了@raynors,有时候就是这样子,可能就是需要有人来点拨一下,那边就一个单词啊!
BUCTCLUB 2018-07-16
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
不要看网上的,特别是有些所谓的“万能服务”的博客不要看,实践中你就会陷入泥潭。

你应该至少学一本正规教程。


大神推荐一本啊
  • 打赏
  • 举报
回复
不要看网上的,特别是有些所谓的“万能服务”的博客不要看,实践中你就会陷入泥潭。

你应该至少学一本正规教程。
raynors 2018-07-15
  • 打赏
  • 举报
回复
应该是:[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
raynors 2018-07-15
  • 打赏
  • 举报
回复
蛋疼,感觉每次都是花了老久找不出答案,然后出分提问之后得到答案 切不到点子上。

再然后继续百度 自己找到答案。

问题其实不难,临门一脚,费了我三天时间,竟然没人知道,也是醉了。

服务端实现服务契约类的实例模式,有三种类型,分别为

PerCall-每次服务操作调用创建一次,调用完后进行销毁;

PerSession-同一个会话期间创建一次,客户端代理第一次操作(IsInitiating = true)调用创建,调用代理的Close方法销毁或者调用IsTerminating服务操作销毁;

Single-服务只会创建一次,服务开始时创建,服务完成时销毁

这玩意儿写在服务定义的头部

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class CalculatorService :ICalculator
{
。。。。。。。
}


然后,对服务的调用可以先实例化再调用。 用法就可以跟传统SOCKET 一样了。


CalculatorService myservice =new CalculatorService();

//myservice.参数 =任意参数;

//在这里可以写EVENT

ServiceHost host = new ServiceHost(myservice);

host.open();

raynors 2018-07-15
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
不要看网上的,特别是有些所谓的“万能服务”的博客不要看,实践中你就会陷入泥潭。

你应该至少学一本正规教程。


实际上,像我这样的,很多时候只是为了完成一个小案例,也许只是卡在一个概念上而已。我的目的也不在成为一个专家,上网的目的就是为了求知,网上大多WCF例子都没有点出我的疑问。也困扰了好几天了,所以才来求助。



111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧