我将创建一个需要在世界各地呼叫托管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。
答案 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对它们进行反序列化。这就是您的类(模型)应该存在于共享项目中的原因,因此您可以在服务调用的两端使用相同的类。