存储WCF对象的实例在哪里?

时间:2014-09-17 19:37:25

标签: c# .net wcf

我将创建一个需要在世界各地呼叫托管WCF服务的服务。这不是什么大不了的交易,因为将要进行的交易数量相对较少。但是,我需要将可能在WCF中定义的类的实例传递给必要的WCF函数。

所以我的问题是,我的服务器上是否存在该类的实例?或者每当我尝试在对象中设置变量时,我是否会联系主机服务器?

示例:`

   public class Dog
{
    public string noise;
    public int numLegs;
}

public class doSomething
{
    public string makeNoise(Dog x)
    {
        return x.noise;
    }
}

` 所有这些都在WCF中定义。因此,当我在本地创建类Dog的实例时,该实例是否存在于我这边或托管WCF服务的服务器上?如果我设置了1000个Dog实例,那么延迟肯定会增加。然而,如果我每次更改我的Dog实例时都不必联系服务器,那么我唯一需要担心延迟的时候就是将它传递给doSomething.makeNoise。

3 个答案:

答案 0 :(得分:1)

主机为每个请求创建服务类的新实例,如果您使用默认的每次调用实例化方法(建议使用此方法)方式)。

因此,这是承载您的WCF服务的 IIS 服务器,该服务会创建服务类的实例,或者是您在其中创建的ServiceHost实例拥有自托管设置(控制台应用程序,Windows服务等)。

服务类实例用于处理您的请求 - 在服务类上执行适当的方法,发回任何结果 - 然后再次处理它。

还有每会话模式,在这种情况下(假设绑定了您选择的支持会话),您的第一个调用将创建一个服务类实例,然后你的后续调用将转到同一个已经创建的实例(直到超时等为止。)

还有 singleton 模式,你有一个服务类的单个实例来处理所有请求 - 但是在编程方面要做到这一点相当棘手, "攻击"在可扩展性和性能方面

答案 1 :(得分:0)

您需要在公共可用服务器(例如IIS)上托管WCF服务。成功托管将为您提供svc文件的链接。点击它会给你一个以singleWsdl结尾的链接。您需要复制该链接。在客户端,需要引用WCF的那个,您需要添加服务引用并传递该链接。这将生成包含Client个对象的代理代码,您可以使用这些对象访问WCF ServiceOperation方法。

答案 2 :(得分:0)

至少应该有三个项目。一个托管实际网站的网站项目。用于托管服务的WCF项目。最后是一个共享项目,它应该包含你所关注的类(模型)。

网站和wcf项目都应该引用共享项目,这样他们都知道模型的外观。

wcf项目应该将序列化模型作为json对象返回,我通常通过引用Newtonsoft.Json来做。

您的网站项目应该使用这个json,并使用Newtonsoft.Json对它们进行反序列化。这就是您的类(模型)应该存在于共享项目中的原因,因此您可以在服务调用的两端使用相同的类。