我是WCF和C#的新手。
我正在尝试使用1个接口(IA)创建一个带有1个方法(Do)的WCF服务,该方法有2个实现(A1和A2)。
一个愚蠢的例子:
IA.cs:
namespace IA_NS
{
[ServiceContract]
public interface IA
{
[OperationContract]
int Do(B b);
}
[DataContract]
public class B
{
[DataMember]
public string b1 { get; set; }
}
}
A1.cs:
namespace A1_NS
{
public class A1 : IA
{
public int Do(B b) {...}
}
}
A2.cs:
namespace A2_NS
{
public class A2 : IA
{
public int Do(B b) {...}
}
}
我的自托管控制台,我托管这两项服务:
class Program
{
static void Main(string[] args)
{
ServiceHost hostA1 = new ServiceHost(typeof(A1_NS.A1));
hostA1.Open();
ServiceHost hostA2 = new ServiceHost(typeof(A2_NS.A2));
hostA2.Open();
Console.WriteLine("Hit any key to exit...");
Console.ReadLine();
hostA1.Close();
hostA2.Close();
}
}
我希望我的WCF客户端能够调用这两个类:
Client.cs:
namespace Client_NS
{
class Program
{
static void Main(string[] args)
{
B myB = new B();
A1 a1 = new A1();
A2 a2 = new A2();
A1.Do(myB);
A2.Do(myB);
}
}
}
没有运气; - (
我尝试在我的WCF服务 app.config 中添加2个元素:
<service name="A1_NS.A1" >
<endpoint address="http://localhost/A1"
contract="IA_NS.IA" />
</service>
<service name="A2_NS.A2" >
<endpoint address="http://localhost/A2"
contract="IA_NS.IA" />
</service>
运行调试器时 - 调试应用程序(WCF服务主机)允许我测试两个类的Do()方法。
我无法让我的客户这样做。我为这两项服务添加了服务参考。 它是客户端app.config还是我误解了什么?
答案 0 :(得分:1)
您可以实现部分类,允许您在维护单个接口和端点时将各个cs文件中的内容分开。这不是最理想的方式,因为在一天结束时,它仍然是由部分类组成的单个类,但至少它在您的文件结构中看起来像它,因此给出了一些分离而不是大量的类文件。
<强> IMyService.cs 强>
[ServiceContract]
public interface IMyService
{
[OperationContract]
string GenericMethod()
[OperationContract]
string GetA(int id)
[OperationContract]
string GetB(int id)
}
<强> MyService.cs 强>
//Put any attributes for your service in this class file
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public partial class MyService : IMyService
{
public string GenericMethod()
{
return "";
}
}
<强> AService.cs 强>
public partial class MyService
{
public string GetA(int id)
{
return "";
}
}
<强> BService.cs 强>
public partial class MyService
{
public string GetB(int id)
{
return "";
}
}
答案 1 :(得分:0)
我看到合同两次(在A2_NS.A2
服务标签下),是错误的还是真的存在,然后删除第二个(关闭端点标签后)并查看这是否与您遇到的问题有关?
contract="IA_NS.IA" />
contract="IA_NS.IA" />