我在使用取消令牌和 XmlSerializer 序列化程式的 .Net 6 中使用 SoapCore 的異步 WCF 服務存在問題。
詳細的WCF應用如下:
- C# .Net Core 6 中的 WCF 服務使用
SoapCoreNuGet 包使用SoapSerializer.XmlSerializer序列化程式 [OperationContract]我創建了一個帶有CancellationToken引數的屬性的異步方法- 我嘗試使用 URL 獲取 WSDL
https://localhost:7026/Services.svc?WSDL,但它失敗了,因為CancellationToken有例外ArgumentException: .NET type CancellationToken cannot be resolved into XML schema type(CancellationToken具有以System(System.Threading.CancellationToken) 開頭的命名空間,是一個結構(值型別),并且按SoapCore代碼分類為非常類似于bool,int,long, ... 和嘗試為它生成一個 XML,但它失敗了) - 我嘗試將屬性添加到具有該屬性的方法
[XmlIgnore]的引數中,但它不起作用CancellationToken[OperationContract] [MessageContract(IsWrapped = false)]不能添加到方法的引數中
注意:這適用于SoapCore序列SoapSerializer.DataContractSerializer化程式,但生成的 WSDL 更大,列舉了許多我不使用的基本型別,SoapSerializer.XmlSerializer如果可能的話我想使用。
Program.cs代碼:
using Microsoft.Extensions.DependencyInjection.Extensions;
using SoapCore;
namespace TestSoapCore;
public static class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSoapCore();
builder.Services.TryAddSingleton<MyService>();
builder.Services.AddMvc();
var app = builder.Build();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.UseSoapEndpoint<MyService>(
"/Services.svc",
new SoapEncoderOptions(),
SoapSerializer.XmlSerializer
// This works with SoapSerializer.DataContractSerializer but I prefer SoapSerializer.XmlSerializer if possible
);
});
app.Run();
}
}
Contract.cs代碼:
using System.Runtime.Serialization;
namespace TestSoapCore;
[DataContract]
public class Contract {
[DataMember]
public string? TestProperty { get; set; }
}
MyService.cs代碼:
using System.ServiceModel;
using System.Xml.Serialization;
namespace TestSoapCore;
[ServiceContract]
public class MyService
{
[OperationContract]
public async Task<string> Test(
Contract contract,
// [MessageContract(IsWrapped = false)] cannot be added to parameters
[XmlIgnore] // This doesn't work
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return contract?.TestProperty "2";
}
}
使用序列化程式時獲取 WSDLhttps://localhost:7026/Services.svc?WSDL時的完全例外SoapSerializer.XmlSerializer:

WSDL 如何在SoapSerializer.XmlSerializer沒有任何序列化程式的情況下作業CancellationToken(但我想要CancellationTokenfor async 方法,最好有它):

WSDL 是如何臃腫的并且有許多我在使用序列化程式時不使用的基本型別SoapSerializer.DataContractSerializer(這就是為什么我仍然更喜歡SoapSerializer.XmlSerializer如果可能的話):
- 第1部分:

- 第2部分:

- 第 3 部分:

- 第 4 部分:

uj5u.com熱心網友回復:
因為CancellationToken使用 SoapCore 的 WCF 不能很好地作業(SoapSerializer.XmlSerializer序列化程式不會生成 WSDL,因為CancellationToken序列化程式SoapSerializer.DataContractSerializer將它CancellationToken作為一個需要發送許多屬性及其型別的物件)我最終CancellationToken完全洗掉了,我使用了SoapSerializer.XmlSerializer擁有更少的資料(WSDL 不會因所有未使用的型別而臃腫,許多頁面無用資料)。
PS:這是CancellationTokenSoapCore 和SoapSerializer.DataContractSerializer序列化程式的外觀(不是很好..):

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515465.html
