使用单个SVC的WCF服务版本控制

时间:2012-09-29 06:43:24

标签: wcf dependency-injection versioning autofac

由于某些要求,我必须使用单个svc用于多个服务版本。我已经使用不同的命名空间分离了每个版本的接口契约。我只有一个类(部分)实现所有服务版本。

我的代码如下:

namespace Application.V1
{
[ServiceContract(Namespace = "http://google.com/ApplicationService/v1.0", Name = "IMathService")]
public interface IMathService
}

namespace Application.V2
{
[ServiceContract(Namespace = "http://google.com/ApplicationService/v2.0", Name = "IMathService")]
public interface IMathService
}

Application / MathServiceV1.cs文件:

public partial class MathService : V1.IMathService { }

Application / MathServiceV2.cs文件:

public partial class MathService : V2.IMathService { }

Application / MathService.cs文件:

public partial class MathService {}

我在服务web.config中添加了以下内容:

  <service behaviorConfiguration="ServiceBehavior" name="Application.MathService">
    <endpoint address="V1" binding="wsHttpBinding" contract="Application.V1.IMathService" />
    <endpoint address="V2" binding="wsHttpBinding" contract="Application.V2.IMathService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

我有一个文件MathService.svc,内容如下:

<%@ ServiceHost Service="Application.MathService, Application"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"%>

如果我使用地址http://localhost:8000/MathService.svc生成代理,则生成客户端端点,如下所示:

    <client>
        <endpoint address="http://localhost:8000/MathService.svc/V1"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMathService"
            contract="MathService.IMathService" name="WSHttpBinding_IMathService">
        </endpoint>
        <endpoint address="http://localhost:8000/MathService.svc/V2"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMathService1"
            contract="MathService.IMathService1" name="WSHttpBinding_IMathService1">
        </endpoint>
    </client>

我担心的是客户端端点地址是使用MathService.svc/V1生成的,但我希望看到V1/MathService.svc

如果我使用地址http://localhost:8000/MathService.svc/V1浏览服务,则会收到HTTP 400 Bad Request错误。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

关于400错误请求错误 - 您可能没有启用MEX,因此在没有有效负载的情况下发出请求对服务没有任何意义。

以下是关于启用MEX的问题: WCF How to enable metadata? 启用MEX - 或使用适当的服务使用者来呼叫您的服务。

关于您的寻址 - 您不能单独使用WCF做您想做的事情。因为您使用的是IIS托管的WCF(我假设这是因为您使用的是SVC文件),所以您的HTTP请求必须定向到您的SVC文件的位置,之后的任何内容(例如/ V1)都用于定位相应的端点。这就是它在IIS中的工作原理。将/ v1 / BEFORE放在文件名(MathService.asmx)后,IIS会在尝试查找名为MathService.asmx的文件之前查找名为/ v1 /的文件夹 - 显然它不会在那里找到任何内容!

但是,您可以在Web.config中安装URL重写器,以将首选URI重定向到上面提到的URI。 以下是关于在asp.net中重写Url的一些文档: http://www.iis.net/learn/extensions/url-rewrite-module/iis-url-rewriting-and-aspnet-routing