Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从自托管WCF服务获取/设置对应用程序其余部分的引用?_C#_Wcf - Fatal编程技术网

C# 如何从自托管WCF服务获取/设置对应用程序其余部分的引用?

C# 如何从自托管WCF服务获取/设置对应用程序其余部分的引用?,c#,wcf,C#,Wcf,让我们假设我有一个windows窗体应用程序,它应该通过.net远程控制或受远程位置的影响 就我在谷歌搜索到的情况而言,在该应用程序中托管WCF服务将是一个不错的选择。我已成功地将WCF服务添加到应用程序中,并可以使用 ServiceHost host = new ServiceHost(typeof(Service1)); host.Open(); 从运行中的应用程序的其余部分获取类引用的好方法是什么? 我想只有这两种方式: 使用静态属性从服务方法中调用其他方法/设置

让我们假设我有一个windows窗体应用程序,它应该通过.net远程控制或受远程位置的影响

就我在谷歌搜索到的情况而言,在该应用程序中托管WCF服务将是一个不错的选择。我已成功地将WCF服务添加到应用程序中,并可以使用

    ServiceHost host = new ServiceHost(typeof(Service1));   
    host.Open();
从运行中的应用程序的其余部分获取类引用的好方法是什么?
我想只有这两种方式:

  • 使用静态属性从服务方法中调用其他方法/设置属性
  • 是否为服务类分配引用?(如何为服务主机中承载的服务分配值?)
什么被认为是一个好的实践,或者说哪种方式在过去对你有效

根据评论更新
我想我在找这样的东西:

    ServiceHost host = new ServiceHost(typeof(Service1));   
    host.Open();  
    (Service1)host.MyProperty = "asd";

我似乎找不到如何将ServiceHost(或其属性)强制转换为Service1的实例。这可能会解决我所有的问题;)

您无法真正执行根据评论添加的内容:

ServiceHost host = new ServiceHost(typeof(Service1));
host.Open();
(Service1)host.MyProperty = "asd";
因为那时还没有创建类
Service1
的实例。只有当服务的新请求到达时,才会创建它们

一种替代方法是使用自定义实例提供程序(如下面的代码所示),在WCF运行时使用该服务实例之前,您可以在其中引用该服务实例。有关实例提供程序的更多信息,请访问

公共类堆栈溢出\u 10932251
{
[服务合同]
公共接口测试
{
[经营合同]
字符串回显(字符串文本);
}
公共类服务:ITest
{
公共字符串MyProperty{get;set;}
公共字符串回显(字符串文本)
{
WriteLine(“Inside Service.Echo,MyProperty={0}”,this.MyProperty);
返回文本;
}
}
静态绑定GetBinding()
{
var result=新的WSHttpBinding(SecurityMode.None);
返回结果;
}
公共类MyInstanceProvider:IEndpointBehavior,IInstanceProvider
{
字符串属性值;
公共MyInstanceProvider(字符串属性值)
{
this.propertyValue=propertyValue;
}
public void AddBindingParameters(ServiceEndpoint端点、BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint端点、ClientRuntime ClientRuntime)
{
}
公共无效ApplyDispatchBehavior(ServiceEndpoint端点、EndpointDispatcher端点Dispatcher)
{
endpointDispatcher.DispatcheRuntime.InstanceProvider=此;
}
公共void验证(ServiceEndpoint)
{
}
公共对象GetInstance(InstanceContext InstanceContext,消息)
{
返回新服务{MyProperty=this.propertyValue};
}
公共对象GetInstance(InstanceContext InstanceContext)
{
返回新服务{MyProperty=this.propertyValue};
}
public void ReleaseInstance(InstanceContext InstanceContext,对象实例)
{
}
}
公共静态无效测试()
{
string baseAddress=“http://“+Environment.MachineName+”:8000/服务”;
ServiceHost主机=新ServiceHost(类型(服务),新Uri(基地址));
ServiceEndpoint=host.AddServiceEndpoint(typeof(ITest),GetBinding(),“”);
添加(新的MyInstanceProvider(“asd”);
host.Open();
Console.WriteLine(“主机已打开”);
ChannelFactory=newchannelfactory(GetBinding(),newendpointaddress(baseAddress));
ITest proxy=factory.CreateChannel();
Console.WriteLine(proxy.Echo(“Hello”);
((IClientChannel)代理).Close();
工厂关闭();
控制台。写入(“按ENTER键关闭主机”);
Console.ReadLine();
host.Close();
}
}

您无法真正执行根据注释添加的操作:

ServiceHost host = new ServiceHost(typeof(Service1));
host.Open();
(Service1)host.MyProperty = "asd";
因为那时还没有创建类
Service1
的实例。只有当服务的新请求到达时,才会创建它们

一种替代方法是使用自定义实例提供程序(如下面的代码所示),在WCF运行时使用该服务实例之前,您可以在其中引用该服务实例。有关实例提供程序的更多信息,请访问

公共类堆栈溢出\u 10932251
{
[服务合同]
公共接口测试
{
[经营合同]
字符串回显(字符串文本);
}
公共类服务:ITest
{
公共字符串MyProperty{get;set;}
公共字符串回显(字符串文本)
{
WriteLine(“Inside Service.Echo,MyProperty={0}”,this.MyProperty);
返回文本;
}
}
静态绑定GetBinding()
{
var result=新的WSHttpBinding(SecurityMode.None);
返回结果;
}
公共类MyInstanceProvider:IEndpointBehavior,IInstanceProvider
{
字符串属性值;
公共MyInstanceProvider(字符串属性值)
{
this.propertyValue=propertyValue;
}
public void AddBindingParameters(ServiceEndpoint端点、BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint端点、ClientRuntime ClientRuntime)
{
}
公共无效ApplyDispatchBehavior(ServiceEndpoint端点、EndpointDispatcher端点Dispatcher)
{
endpointDispatcher.DispatcheRuntime.InstanceProvider=此;
}
公共void验证(ServiceEndpoint)
{
}
公共对象GetInstance(InstanceContext InstanceContext,消息)