首页 > 其他分享 >看看.net core中的WCF

看看.net core中的WCF

时间:2022-12-04 16:45:56浏览次数:33  
标签:core Console item WCF var new net public

  .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;
    }
}

结果:

  想要更快更方便的了解相关知识,可以关注微信公众号 

标签:core,Console,item,WCF,var,new,net,public
From: https://www.cnblogs.com/axzxs2001/p/16950097.html

相关文章

  • 学习ASP.NET Core Blazor编程系列十五——查询
    学习ASP.NETCoreBlazor编程系列一——综述学习ASP.NETCoreBlazor编程系列二——第一个Blazor应用程序(上)学习ASP.NETCoreBlazor编程系列二——第一个Blazor应......
  • .NET7之MiniAPI(特别篇):.NET7 Preview3
    .NET7的第三个预览版发布了,同样带来了miniapi的更新,这次带来了路由过滤器,与mvc版的action过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-up......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(args);......
  • .NET7之MiniAPI(特别篇):.NET7 Preview3
    .NET7的第三个预览版发布了,同样带来了miniapi的更新,这次带来了路由过滤器,与mvc版的action过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-u......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(ar......
  • .NET点滴:说说Middleware构造中获取不到Scoped服务的问题
    “为什么中间件的构造函数里不能使用scope的生命周期类型啊?”,那就用实例来得到答案吧,先看小桂说的情况,是报错的:varbuilder=WebApplication.CreateBuilder(ar......
  • .NET7之MiniAPI(特别篇):.NET7 Preview3
    .NET7的第三个预览版发布了,同样带来了miniapi的更新,这次带来了路由过滤器,与mvc版的action过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-u......
  • Kubernetes监控手册04-监控Kube-Proxy
    简介首先,请阅读文章《​​Kubernetes监控手册01-体系介绍​​》,回顾一下Kubernetes架构,Kube-Proxy是在所有工作负载节点上的。Kube-Proxy默认暴露两个端口,10249用于暴露......
  • .NET点滴:Span<T>
    把一个数组的全部元素加1,有什么好办法,于是有了下面的分析:vararr=newint[]{1,2,3,4,5,6,7,8,9};//方法一foreach(variinarr){i++;}//方法二for(......
  • .NET点滴:Span<T>
    把一个数组的全部元素加1,有什么好办法,于是有了下面的分析:vararr=newint[]{1,2,3,4,5,6,7,8,9};//方法一foreach(variinarr){i++;}//方......