我是编程WCF服务的新手,所以我希望如果你回答我的问题 - 你会考虑到这一点并向我解释,好像我还是个孩子(wcf服务为傻瓜:)。我有一个现有的WCF服务,我需要连接到该服务。我应该创建自己的WCF服务,它将与现有服务进行通信并共享一些已在现有服务中定义的请求和响应对象。任何人都可以告诉我如何做到这一点(建立两者之间的通信,并在我需要的服务中使用相同类型的对象,就像现有的一样),一步一步?我试图在网上找到答案,但它有点令人困惑(引用,使用合同......)。正如我所说,你可以自由地解释,就像你想要一个真正的初学者。任何帮助都非常受欢迎......
答案 0 :(得分:2)
“我应该创建自己的WCF服务,它将与现有服务进行通信并共享一些已在现有服务中定义的请求和响应对象。” - 听起来您需要创建一个客户端来连接服务(请参阅下面的如何创建客户端)。您可以创建WCF服务以与其他服务进行通信,但您需要比此格式允许的更多背景。
您可以通过WCF examples快速了解WCF。在示例中的WF_WCF_Samples \ WCF \ Basic下,您可以找到许多应首先进行的服务/客户端设置。 MSDN Magazine有很多关于这个主题的文章。
在10000英尺的视野中:
客户端 - 使用服务创建测试控制台应用程序。在项目中添加服务引用(右键单击引用时,您将看到该选项)。将服务引用对话框的地址指向您要使用的服务,并且会发生很多事情。最终结果是您可以使用下面的内容调用服务上的服务方法(其中Service1将替换为您正在调用的服务)
static void Main(string[] args)
{
var proxy = new ServiceReference1.Service1Client();
var test = proxy.GetData(1);
}
服务 - 您将创建一个包含方法和类型的接口,然后使用属性装饰此接口,例如:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
这些是您的服务可以执行的操作(OperationContract)。服务方法可以返回原始类型或复杂类型(字符串与CompositeType)以及获取复杂或原始的参数。
您将实施此合同:
public class Service1 : IService1
{
public string GetData(int value)
{
throw new ApplicationException("Boom");
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
接下来,您需要托管您的服务。根据您的托管要求,您有很多选择可以完成此任务。您可以做的最简单的托管是使用控制台应用程序:
class Program
{
static void Main(string[] args)
{
var host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8999/"));
host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "");
var metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metadataBehavior == null)
{
metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(metadataBehavior);
}
host.Open();
Console.WriteLine("Running..");
Console.ReadLine();
}
}