WCF获取条目程序集

本文关键字:程序集 获取 WCF | 更新日期: 2023-09-27 17:58:21

我有一个WCF服务,比方说程序集a,它托管在IIS中。WCF服务引用了另一个程序集,比如说程序集B,它需要访问程序集a的assembly对象。

原因:我想用一个额外的约定和该约定的默认实现来扩展现有的WCF服务,该约定可以返回WCF服务程序集的FILE VERSION

请参阅下面的代码:

程序集A(WCF服务):

web.config:除了地址"B"下的现有2个端点之外,还添加了一个新端点

<configuration>
  <system.serviceModel>
    <services>
      <service name="ExistingServiceHandler">
        <endpoint address="mex" kind="mexEndpoint"/>
        <endpoint address="" binding="basicHttpBinding" contract="IExistingContract"/>
        <endpoint address="B" binding="basicHttpBinding" contract="AssemblyB.IServiceContract"/>
      </service>
      ...

现有实现:现在从程序集B.扩展"实现"

public class ExistingServiceHandler : Implementation, IExistingContract
{
    // Whatever methods are implemented here
}

程序集B(C#类库):

[ServiceContract]
public interface IServiceContract
{
    [OperationContract]
    string ServiceVersion();
}
public class Implementation : IServiceContract 
{
    public string ServiceVersion()
    {
        string assemblyLocation = Assembly.GetEntryAssembly().Location;
        FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assemblyLocation);
        string fileVersion = fvi.FileVersion;
        return fileVersion;
    }   
}

我尝试了以下(在程序集B中),但没有一个返回正确的程序集:

Assembly.GetEntryAssembly(); // returns NULL
Assembly.GetExecutingAssembly(); // returns assembly B
Assembly.GetCallingAssembly(); // returns System.ServiceModel

那么,如何获取程序集"A"(WCF服务)的程序集

注:

  • 我想使用程序集B中的contract+实现,只需最少的工作量。这意味着我不想必须更改现有的服务实现,除了让类从新约定的默认实现(程序集B中的实现)扩展之外。提前感谢

WCF获取条目程序集

程序集A似乎从未真正调用程序集B,只是扩展了它的类。因此,GetCallingAssembly返回System.ServiceModel(WCF)。我认为你需要检查this的类型如下:

[ServiceContract]
public interface IServiceContract
{
    [OperationContract]
    string ServiceVersion();
}
public class Implementation : IServiceContract 
{
    public string ServiceVersion()
    {
        string assemblyLocation = this.GetType().Assembly.Location;
        FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assemblyLocation);
        string fileVersion = fvi.FileVersion;
        return fileVersion;
    }   
}

不应强制使用Reflection和Assembly.GetSomething方法的正常方式。难道你不能将程序集A中的一些对象注入到具有接口(契约)共享程序集的程序集B方法中吗?这是一个非常非常粗略的解决方案:

组件A

class Service
{
    public void ServiceMethod1()
    {
        // Here you create type from Assembly B but inject object from Assembly A
        var obj = new SomeClass(new SomeSharedClass()); 
    }
}
class SomeSharedClass : ISomeSharedContract
{
    // SomeMethod implementation
}

组件B

class SomeClass
{
    private ISomeSharedContract dependency;
    public SomeClass(ISomeSharedContract dependency)
    {
        this.dependency = dependency;
    }
    private HereYourMethod(...)
    {
        // ...
        this.dependency.SomeMethod(); // Here you gain access to Assembly A object
        // ...
    }
}

组件C-接口

interface ISomeSharedContract
{
    void SomeMethod();
}

您可以通过使用一些常见的依赖注入容器来扩展此示例,如Unity、ninject或Windsor Castle。。。