由于某些要求,我必须使用单个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
错误。
有什么建议吗?
答案 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