C++ WebService调用方客户端代码:
#include "soapBasicHttpBinding_USCOREServiceContractProxy.h"
#include "soapH.h"
#include <tchar.h>
const char server[] = "http://localhost:5293/Controllers/WebService.asmx";
/**
* 处理字符串,避免乱码问题
*/
char* ToMultiString(wchar_t* str)
{
int wide_len = static_cast<int>(wcslen(str) + 1);
int multi_len = WideCharToMultiByte(CP_ACP,0, str, wide_len, nullptr, 0, nullptr, nullptr);
// 分配多字节字符串的空间
char* multi_string = new char[multi_len];
// 转换宽字符串到多字节字符串
WideCharToMultiByte(CP_ACP, 0, str, wide_len, multi_string, multi_len, nullptr, nullptr);
return multi_string;
}
/**
* 跨语言调用WebService,程序入口
*/
int main()
{
//创建 soap环境
BasicHttpBinding_USCOREServiceContractProxy soap(server);
_tempuri__Get req;//请求参数
req.sno = const_cast < wchar_t*>(L"123");
_tempuri__GetResponse resp;//服务端相应参数
int result = soap.Get(&req, resp); //调用WebService服务提供者的Get方法
if (result == SOAP_OK)
{
char* name = ToMultiString(resp.GetResult->Name); //使用ToMultiString处理字符串避免乱码问题
char* sno = ToMultiString(resp.GetResult->Sno);
char* grade = ToMultiString(resp.GetResult->Grade);
std::cout << sno << name << grade << std::endl; //打印结果
delete name;
delete sno;
delete grade;
}
else
{
}
}
C# Asp.Net Core WebService服务提供者代码:
using Microsoft.Extensions.DependencyInjection.Extensions;
using SoapCore;
using System.ServiceModel;
using System.Text;
using WebServiceTest.Controllers;
using WebServiceTest.Service;
namespace WebServiceTest
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.TryAddSingleton<ServiceContract, WebService>();
builder.Services.AddSoapCore();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
SoapEncoderOptions options = new SoapEncoderOptions();
options.WriteEncoding = Encoding.UTF8;
endpoints.UseSoapEndpoint<ServiceContract>("/Controllers/WebService.asmx", options, SoapSerializer.DataContractSerializer);
});
app.Run();
}
}
}
using Microsoft.AspNetCore.Mvc;
using WebServiceTest.Models;
using WebServiceTest.Service;
namespace WebServiceTest.Controllers
{
public class WebService : ServiceContract
{
public StudentModel Get(string sno)
{
return new StudentModel() { Sno = sno, Name = "小红", Grade = "202002", Birthday = new DateTime(2012, 8, 15) };
}
}
}
using System.Runtime.Serialization;
namespace WebServiceTest.Models
{
[DataContract]
public class StudentModel
{
/// <summary>
/// 学号
/// </summary>
[DataMember]
public string Sno { get; set; }
/// <summary>
/// 姓名
/// </summary>
[DataMember]
public string Name { get; set; }
/// <summary>
/// 班级
/// </summary>
[DataMember]
public string Grade { get; set; }
/// <summary>
/// 生日
/// </summary>
[DataMember]
public DateTime Birthday { get; set; }
}
}
using System.ServiceModel;
using WebServiceTest.Models;
namespace WebServiceTest.Service
{
[ServiceContract]
public interface ServiceContract
{
[OperationContract]
StudentModel Get(string sno);
}
}