看看.net core中的WCF

.net core下迎来了WCF——CoreWCF1.0,做了一个最初级的Demo,尝尝鲜。

首先在NuGet中引入下面两个包

CoreWCF.Http 

CoreWCF.Primitives

本demo是用WCF实现一个ToDoList的几个服务端方法,然后用创建客户端服务调用,代码如下:.

WCF服务配置文件

{
  "Urls": "http://localhost:5000;https://localhost:5001",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

WCF服务代码:

using CoreWCF;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
using CoreWCF.Configuration;
using CoreWCF.Description;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.AllowSynchronousIO = true;
});

builder.Services.AddServiceModelServices().AddServiceModelMetadata();
builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>();

var app = builder.Build();
app.UseServiceModel(builder =>
{
    builder
    .AddService(typeof(ToDoService))
    .AddServiceEndpoint<ToDoService, IToDoService>(new BasicHttpBinding(), "/ToDoService/basichttp")
    .AddServiceEndpoint<ToDoService, IToDoService>(new WSHttpBinding(SecurityMode.Transport), "/ToDoService/WSHttps");
});

var serviceMetadataBehavior = app.Services.GetRequiredService<ServiceMetadataBehavior>();
serviceMetadataBehavior.HttpGetEnabled = true;

app.Run();

[DataContract]
public record Item
{
    [DataMember]
    public string? Title { get; set; }
    [DataMember]
    [AllowNull]
    public string? Description { get; set; }
    [DataMember]
    public DateTime CreateOn { get; set; }
    [DataMember]
    public bool IsComplete { get; set; } = false;
}

[ServiceContract]
public interface IToDoService
{
    [OperationContract]
    bool Add(Item item);

    [OperationContract]
    List<Item> GetList();

    [OperationContract] 
    bool Remove(string? title);
}

public class ToDoService : IToDoService
{
    static List<Item> _list = new List<Item>();

    public bool Add(Item item)
    {
        item.CreateOn = DateTime.Now;
        _list.Add(item);
        return true;
    }

    public List<Item> GetList() => _list;

    public bool Remove(string? title)
    {
        var item = _list.SingleOrDefault(s => s.Title == title);
        if (item != null)
        {
            return _list.Remove(item);
        }
        else
        {
            return false;
        }
    }
}

创建调用项目,右键项目“添加”-“服务引用”,选择WCF Web Service,在启动WCF服务的情况下,执行下面图示:

看看.net core中的WCF

看看.net core中的WCF

看看.net core中的WCF

看看.net core中的WCF

看看.net core中的WCF

引入ToDoService后会多一个Connected Services的文件夹,刚才一顿操作的产物。因为在服务端Item类是record类型,自动生成会把它变成class,这里需要手动改成record,方便输出时数据好看一些。

看看.net core中的WCF

客户端代码,直接使用ToDoService:

using ToDoServiceReference;
var client = new ToDoServiceClient(ToDoServiceClient.EndpointConfiguration.WSHttpBinding_IToDoService, "https://localhost:5001/ToDoService/WSHttps");
while (true)
{
    Console.WriteLine("1、Add ToDo  2、Get ToDoList 3、Remove ToDo");
    switch (Console.ReadLine())
    {
        case "1":
            var addResult = await client.AddAsync(new AddRequest
            {
                item = new Item { Title = "title_" + DateTime.Now.ToString("yyyyMMddHHmmss"), Description = "description_" + DateTime.Now.ToString("yyyyMMddHHmmssffffff") }
            });
            Console.WriteLine(addResult.AddResult);
            break;
        case "2":
            var listResult = await client.GetListAsync(new GetListRequest { });
            foreach (var item in listResult.GetListResult)
            {
                Console.WriteLine(item);
            }
            break;
        case "3":
            var delResult = await client.RemoveAsync(new RemoveRequest
            {
                title = Console.ReadLine()
            });
            Console.WriteLine(delResult.RemoveResult);
            break;
        default:
            Console.WriteLine("input error");
            break;
    }
}

结果:

看看.net core中的WCF