我是 WCF 服务编程的新手,所以我希望如果你回答我的问题 - 你会考虑到这一点,并像我小时候一样向我解释(wcf 服务傻瓜:)。我有一个需要连接的现有 WCF 服务。我应该创建自己的 WCF 服务,该服务将与现有服务进行通信并共享一些已在现有服务中定义的请求和响应对象。谁能告诉我该怎么做(建立两者之间的通信并在服务中使用与现有服务相同类型的对象),一步一步?我试图在网上找到答案,但这有点令人困惑(参考,使用合同......)。正如我所说,您可以像向真正的初学者一样自由地解释。任何帮助都非常受欢迎......
1 回答
“我应该创建自己的 WCF 服务,该服务将与现有服务进行通信,并共享一些已在现有服务中定义的请求和响应对象。” - 这听起来你需要创建一个客户端来连接到服务(见下文如何创建客户端)。您可以创建 WCF 服务以与其他服务进行通信,但您需要比这种格式允许的更多背景。
您可以通过WCF 示例快速了解 WCF 。在示例中的 WF_WCF_Samples\WCF\Basic 下,您可以找到许多应首先进行的服务/客户端设置。MSDN 杂志有大量关于这个主题的文章。
在 10,000 英尺的视野中:
客户端 - 要使用服务,请创建一个测试控制台应用程序。在您的项目中添加服务引用(当您右键单击引用时,您将看到该选项)。将“服务引用”对话框的地址指向您要使用的服务,就会发生很多事情。最终结果是您可以使用以下内容调用服务上的服务方法(其中 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();
}
}