gpt4 book ai didi

WCF如何绑定(bind)多个服务契约?

转载 作者:行者123 更新时间:2023-12-04 10:53:55 95 4
gpt4 key购买 nike

首先,我会道歉,因为这可能是重复的,但我读到的所有内容似乎都不完整或令人困惑,因为我对 WCF 很陌生。

我基本上希望在 IIS 中部署一个 WCF 服务,可以访问 2 个端点,并且整天都在绕圈子:(

我有一个具有以下结构的服务库 WCF dll

App.config
TestSvc1.cs
ITestSvc1.cs
TestSvc2.cs
ITestSvc2.cs

这在 VS WCF 测试客户端中运行良好,现在我正在部署到 IIS,所以我创建了一个 WCF 服务应用程序并引用了 dll。该项目具有以下结构
Service1.svc
Web.config
Service1.svc包含这个
<%@ ServiceHost Language="C#" Debug="true" 
Service="WCFServices.TestServices.ITestSvc1" CodeBehind="Service1.svc.cs" %>

和我的 web.config有以下
<services>
<service name="WCFServices.TestServices.TestSvc2">
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages"
contract="WCFServices.TestServices.ITestSvc2">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/wcf2/TestServices/TestSvc2/" />
</baseAddresses>
</host>
</service>
<service name="WCFServices.TestServices.TestSvc1">
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages"
contract="WCFServices.TestServices.ITestSvc1"
listenUri="http://localhost:8080/wcf2/service1.svc">
<identity>
<dns value="" />
</identity>
</endpoint>
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages"
contract="WCFServices.TestServices.ITestSvc2"
listenUri="http://localhost:8080/wcf2/service1.svc">
<identity>
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/wcf2/TestServices/TestSvc1/" />
</baseAddresses>
</host>
</service>
</services>

任何帮助将不胜感激。如您所见,我尝试在 web.config 中添加一个额外的端点。但这不起作用,我收到一条错误消息,说在 TestSvc1 中找不到 TestSvc2 调用,我猜这与 Service1.svc 中的条目有关

我还阅读了有关创建继承这些接口(interface)的类的信息,但我不确定如何根据上面的内容来实现它。是否需要修改 Service1.svc ?
public interface MultipleSvc : ITestSvc1, ITestSvc2
{
// What exactly do I put here? I have no idea, do I leave it blank? This didn't work for me
}

任何帮助将不胜感激,谢谢:)

最佳答案

黄金法则:一个 .svc = 一项服务 (或更具体地说:一个服务实现类)

因此,如果您确实有两个独立的、不同的服务(在类 WCFServices.TestServices.TestSvc1WCFServices.TestServices.TestSvc2 中),那么您需要 两个 .svc文件 (每个服务一个)

你能做的是拥有一种服务实现类实现两个服务契约(Contract):

public class MultipleServices : ITestSvc1, ITestSvc2
{
// implement the service logic here, for both contracts
}

在这种情况下, 一个 svc 文件 就足够了( .svc 文件是 每个实现类 并且可以托管多个服务契约(Contract))。但是你也需要改变你的配置——因为你真的只有 一个服务等级 (因此:一个 <service> 标签)和其中托管的多个合约:
<services>
<service name="WCFServices.TestServices.MultipleServices">
<endpoint
address="Service1"
binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages"
contract="WCFServices.TestServices.ITestSvc1">
<identity>
<dns value="" />
</identity>
</endpoint>
<endpoint
address="Service2"
binding="wsHttpBinding" bindingConfiguration="LargeSizeMessages"
contract="WCFServices.TestServices.ITestSvc2">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>

另外:由于您似乎在 IIS 中托管 WCF 服务,因此定义任何 <baseAddress> 毫无意义。值 - 您的服务的“基”地址是 *.svc 所在的位置 (URI)文件生活。

关于WCF如何绑定(bind)多个服务契约?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14336861/

95 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com