首页 > 其他分享 >netcore构建webservice以及调用的完整流程

netcore构建webservice以及调用的完整流程

时间:2024-05-27 22:55:43浏览次数:27  
标签:调用 服务 webservice netcore int ServiceBase var new public

目录
构建
前置准备
编写服务
挂载服务
处理SoapHeader
调用
添加服务
调用服务
补充内容
构建
前置准备
框架版本要求:netcore3.1以上
引入nuget包 SoapCore

编写服务
1.编写服务接口
示例

using System.ServiceModel;

namespace Services;

[ServiceContract(Namespace = "http://Demo.WebService/")]
public interface ISampleService{
[OperationContract]
int CalcAdd(int a,int b);
}
1
2
3
4
5
6
7
8
9
2.继承服务接口
示例

public class SampleService:ISampleService{
public int CalcAdd(int a,int b){
return a+b;
}
}
1
2
3
4
5
如果输入输出参数是一个类,需要这么声明

using System.Runtime.Serialization;

namespace Models;

[DataContract]
public class ReturnValue
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
挂载服务
.net6\7写法

//other code
builder.Services.AddSoapCore();
builder.Services.TryAddSingleton<ISampleService, SampleService>();
//other code
app.UseRouting();
app.UseEndpoints(endpoints =>
{
//注册webservice
endpoints.UseSoapEndpoint<ISampleService>("/SampleService.asmx", new SoapEncoderOptions(), SoapSerializer.XmlSerializer);
});
1
2
3
4
5
6
7
8
9
10
至此最小案例已完成,启动服务后,任意支持webservice的客户端可通过"SampleService.asmx"调用服务

处理SoapHeader
1.创建承载Header的类
示例

public class HeaderValue{
public string Token{get;set;}
}
1
2
3
2.创建ServiceBase

public class ServiceBase{
public HeaderValue headerValue;
public ServiceBase(){
headerValue=new HeaderValue();
}
/// <summary>
/// 从BODY解析SoapHeader,SoapCore没有提供解析Header,因此从客户端提交的XML内容里取出SoapHeader
/// </summary>
/// <param name="body"></param>
public void ParseHeaderFromBody(Stream body){
body.Seek(0, SeekOrigin.Begin);
using var reader = new StreamReader(body);
var xml = reader.ReadToEndAsync().GetAwaiter().GetResult();
if (string.IsNullOrEmpty(xml))
{
return;
}
var envelope = new XmlDocument();
envelope.LoadXml(xml);
var node = envelope.DocumentElement?.ChildNodes.Cast<XmlNode>().FirstOrDefault(n => n.LocalName == "Header")?.FirstChild;
if (node == null)
{
return;
}
var cns = node.ChildNodes.Cast<XmlNode>();
headerValue.Token=cns.FirstOrDefault(d => d.LocalName == "Token")?.InnerText;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
3.所有服务继承ServiceBase
示例

public class SampleService:ServiceBase,ISampleService{
public int CalcAdd(int a,int b){
Console.WriteLine($"headervalue-token:{headerValue.Token}");
return a+b;
}
}
1
2
3
4
5
6
4.创建ServiceOperationTuner

public class ServiceOperationTuner : IServiceOperationTuner
{
public void Tune(HttpContext httpContext, object serviceInstance, OperationDescription operation)
{
var service = serviceInstance as ServiceBase;
service.ParseHeaderFromBody(httpContext.Request.Body);
}
}
1
2
3
4
5
6
7
8
5.挂载ServiceOperationTuner

builder.Services.AddSoapServiceOperationTuner(new ServiceOperationTuner());
1
6.其它配置

//全局启用流缓冲
app.Use((context, next) =>
{
context.Request.EnableBuffering();
return next();
});
1
2
3
4
5
6
调用
添加服务

 


一路下一步就行了

调用服务
//初始化client,连接地址是服务发现里填的那个,如果想改地址,查看这个构造函数的其它重载
var _SampleServiceClient = new SampleServiceClient();
//处理SoapHeader
using var scope = new OperationContextScope(_SampleServiceClient.InnerChannel);
//客户端准备好同样的HeaderValue类
var header = MessageHeader.CreateHeader("headerValue", "http://Demo.WebService/", new HeaderValue
{
Token="this is token"
});
OperationContext.Current.OutgoingMessageHeaders.Add(header);
//调用服务里的函数
_SampleServiceClient.CalcAdd(1,2);
1
2
3
4
5
6
7
8
9
10
11
12
补充内容
1.netcore创建的webservice没有主动声明SoapHeader,所以客户端想携带Header就要绕一下
2.soapheader和http header是俩个概念,soapheader存在于服务请求的body中,http header存在于服务请求的协议报文中
3.SoapCore来源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/kw269937519/article/details/129037097

标签:调用,服务,webservice,netcore,int,ServiceBase,var,new,public
From: https://www.cnblogs.com/webenh/p/18216756

相关文章

  • .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
    目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#和Golang互调C#调用GolangGolang调用C#其他 背景其实,规划这篇文章有一段时......
  • 测试类实现调用私有方法
     1、普通实体类中的私有方法publicclassMyClass{privateStringprivateMethod(Stringa1,inta2){returnnull;}} 2、在测试类中调用(或其他类中调用),在测试类的测试方法里最好加个try{}catch()publicclassMyTest{@Testp......
  • 基于.NET Framework 4.8.1的ASP.NET Web用Gitlab Runner调用MSBuild之后没有bin\rosl
    摘要基于.NETFramework4.8.1的传统ASP.NETWeb程序,使用GitlabRunner自动集成,在发布的网站目录下,没有bin\Roslyn文件夹。这里涉及到容易被忽视的Roslyn编译器的知识点。Roslyn是什么?在我们的ASP.NETWeb项目源代码中有什么体现?1、web.config下有配置节点一般在web.config末......
  • 调用三方接口,outputStream.write传参数中参数怎么写,在转化成字节数组之前,是A=a&B=b的
    当您调用第三方接口并通过OutputStream.write()方法发送参数时,如果接口期望的是application/x-www-form-urlencoded类型的参数(常见于POST请求中提交表单数据),那么您确实需要将参数转换成A=a&B=b这样的格式,然后再将这个字符串转换成字节数组。以下是转换和发送这种类型参数的步骤:......
  • 调用三方接口,outputStream.write传参数中参数怎么写
    当您调用一个第三方接口并需要使用OutputStream.write()方法发送数据时,您通常需要将数据转换为字节格式,因为write()方法接受的是字节(byte)、字节数组(byte[])或字节数组的一个子序列作为参数。以下是几种常见的情况和相应的示例:发送字节数组:如果您已经有了一个字节数组,您可以直接......
  • Python调用科大讯飞在线语音合成API --内附完整项目
    一,注册讯飞账号,并实名制。讯飞开放平台-以语音交互为核心的人工智能开放平台(xfyun.cn)二、找到音频合成,按页面提示申请免费试用。在线语音合成_免费试用-讯飞开放平台(xfyun.cn)三、申请免费使用后,找到API信息如下:​ 四、找到开发者文档,仔细阅读语音合成(流式版)WebAP......
  • java调用科大讯飞在线语音合成API --内附完整项目
    科大讯飞语音开放平台基础环境搭建1.用户注册 注册科大讯飞开放平台账号2.注册好后先创建一个自己的应用创建完成后进入应用可以看到我们开发需要的三个参数:APPID,APISecret,APIKey3.因为平台提供的SDK中只支持了简单的中英两种语言语音合成,所以这里我们不会用提供的Jav......
  • 服务发现组件 Eureka 的几个主要调用过程
     前言现在流行的微服务体系结构正在改变我们构建应用程序的方式,从单一的单体服务转变为越来越小的可单独部署的服务(称为微服务),共同构成了我们的应用程序。当进行一个业务时不可避免就会存在多个服务之间调用,假如一个服务A要访问在另一台服务器部署的服务B,那么前提是服......
  • Lua调用其他脚本
    Lua是一种轻量级的脚本语言,它通常用于嵌入式系统和游戏开发中。Lua本身并没有直接访问其他脚本文件的功能,但是你可以编写一个Lua脚本来加载和执行其他Lua脚本文件。以下是一些基本的方法来在Lua中访问和执行其他脚本:require:这是最常用的方法来加载其他Lua脚本。require函数......
  • 通过apisix调用eureka上注册的服务示例
    ---apiVersion:apisix.apache.org/v2kind:ApisixUpstreammetadata:labels:app:test-servicename:test-servicenamespace:crmspec:scheme:httploadbalancer:type:roundrobintimeout:connect:10ssend:15sread:15sd......