看看.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服务的情况下,执行下面图示:
引入ToDoService后会多一个Connected Services的文件夹,刚才一顿操作的产物。因为在服务端Item类是record类型,自动生成会把它变成class,这里需要手动改成record,方便输出时数据好看一些。
客户端代码,直接使用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;
}
}
结果:
想要更快更方便的了解相关知识,可以关注微信公众号
![](https://img2023.cnblogs.com/blog/1101861/202212/1101861-20221204162710645-404906118.png)