如何捕获 ExtendedSocketException?

Mat*_*tze 7 c# sockets exception .net-core

这可能听起来很愚蠢,但我就是抓不到ExtendedSocketException被抛出的东西SocketTaskExtensions.ConnectAsync()

完整的命名空间是:System.Net.Internals.SocketExceptionFactory.ExtendedSocketException

编译器抱怨Cannot resolve symbol 'ExtendedSocketException'. 我的类库和测试项目都针对 .Net Core 2.1。

此外,也没有可以添加的此类参考或 Nuget 包。至少我找不到任何东西......而且https://learn.microsoft.com上似乎也没有任何东西......

我在这里做错了什么?

[Fact]
[Trait("Category", "UnitTest")]
public async Task Should_Throw_Exception_If_Port_Unreachable()
{
    // Arrange
    var client = new TcpConnector();
    var nonListeningPort = 81;
    var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), nonListeningPort);

    // Act & Assert
    var connectTask = client.ConnectAsync(endpoint);
    Func<Task> func = async () => { await connectTask; };

    func.Should().Throw<ExtendedSocketException>();
}
Run Code Online (Sandbox Code Playgroud)

jsp*_*cal 10

ExtendedSocketException是一个private类,因此您无法在 .NET 内部外部引用它。但是您可以捕获SocketException并检查异常消息。


Grz*_*lko 5

尽管本ExtendedSocketException应是私有的,但它肯定会被暴露: 扩展套接字异常

另一方面,它继承自SocketException,所以我们不需要太关心它。

就您的测试而言,我认为您应该能够将您的断言修改为类似于以下内容的内容:

var exception = Assert.Catch(func);
Assert.IsInstanceOf<SocketException>(exception);
Assert.That(exception.Message.Contains("actively refused"));
Run Code Online (Sandbox Code Playgroud)