Пример #1
0
    public async Task Server_ConnectExistingQueueName_Success(RequestQueueMode queueMode)
    {
        string address;
        var    queueName = Guid.NewGuid().ToString();

        // First create the queue.
        HttpRequestQueueV2Handle requestQueueHandle = null;
        var statusCode = HttpApi.HttpCreateRequestQueue(
            HttpApi.Version,
            queueName,
            IntPtr.Zero,
            0,
            out requestQueueHandle);

        Assert.True(statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS);

        // Now attach to the existing one
        using (Utilities.CreateHttpServer(out address, httpContext =>
        {
            return(Task.FromResult(0));
        }, options =>
        {
            options.RequestQueueName = queueName;
            options.RequestQueueMode = queueMode;
        }))
        {
            var psi = new ProcessStartInfo("netsh", "http show servicestate view=requestq")
            {
                RedirectStandardOutput = true
            };
            using var process = Process.Start(psi);
            process.Start();
            var netshOutput = await process.StandardOutput.ReadToEndAsync();

            Assert.Contains(queueName, netshOutput);

            var prefix = UrlPrefix.Create(address);
            switch (queueMode)
            {
            case RequestQueueMode.Attach:
                Assert.Equal("0", prefix.Port);

                break;

            case RequestQueueMode.CreateOrAttach:
                Assert.NotEqual("0", prefix.Port);
                Assert.Contains(address, netshOutput, StringComparison.OrdinalIgnoreCase);

                break;
            }
        }
    }
Пример #2
0
    public async Task Server_AttachToExistingQueue_NoIServerAddresses_NoDefaultAdded(RequestQueueMode queueMode)
    {
        var queueName = Guid.NewGuid().ToString();

        using var server = Utilities.CreateHttpServer(out var address, httpContext => Task.CompletedTask, options =>
        {
            options.RequestQueueName = queueName;
        });
        using var attachedServer = Utilities.CreatePump(options =>
        {
            options.RequestQueueName = queueName;
            options.RequestQueueMode = queueMode;
        });
        await attachedServer.StartAsync(new DummyApplication(context => Task.CompletedTask), default);

        var addressesFeature = attachedServer.Features.Get <IServerAddressesFeature>();

        Assert.Empty(addressesFeature.Addresses);
        Assert.Empty(attachedServer.Listener.Options.UrlPrefixes);
    }
Пример #3
0
 internal RequestQueue(UrlGroup urlGroup, string?requestQueueName, RequestQueueMode mode, ILogger logger)
     : this(urlGroup, requestQueueName, mode, logger, false)
 {
 }
Пример #4
0
    private RequestQueue(UrlGroup?urlGroup, string?requestQueueName, RequestQueueMode mode, ILogger logger, bool receiver)
    {
        _mode    = mode;
        UrlGroup = urlGroup;
        _logger  = logger;

        var flags = HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.None;

        Created = true;

        if (_mode == RequestQueueMode.Attach)
        {
            flags   = HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.OpenExisting;
            Created = false;
            if (receiver)
            {
                flags |= HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.Delegation;
            }
        }

        var statusCode = HttpApi.HttpCreateRequestQueue(
            HttpApi.Version,
            requestQueueName,
            null,
            flags,
            out var requestQueueHandle);

        if (_mode == RequestQueueMode.CreateOrAttach && statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_ALREADY_EXISTS)
        {
            // Tried to create, but it already exists so attach to it instead.
            Created    = false;
            flags      = HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.OpenExisting;
            statusCode = HttpApi.HttpCreateRequestQueue(
                HttpApi.Version,
                requestQueueName,
                null,
                flags,
                out requestQueueHandle);
        }

        if (flags.HasFlag(HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.OpenExisting) && statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_FILE_NOT_FOUND)
        {
            throw new HttpSysException((int)statusCode, $"Failed to attach to the given request queue '{requestQueueName}', the queue could not be found.");
        }
        else if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_INVALID_NAME)
        {
            throw new HttpSysException((int)statusCode, $"The given request queue name '{requestQueueName}' is invalid.");
        }
        else if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS)
        {
            throw new HttpSysException((int)statusCode);
        }

        // Disabling callbacks when IO operation completes synchronously (returns ErrorCodes.ERROR_SUCCESS)
        if (HttpSysListener.SkipIOCPCallbackOnSuccess &&
            !UnsafeNclNativeMethods.SetFileCompletionNotificationModes(
                requestQueueHandle,
                UnsafeNclNativeMethods.FileCompletionNotificationModes.SkipCompletionPortOnSuccess |
                UnsafeNclNativeMethods.FileCompletionNotificationModes.SkipSetEventOnHandle))
        {
            requestQueueHandle.Dispose();
            throw new HttpSysException(Marshal.GetLastWin32Error());
        }

        Handle      = requestQueueHandle;
        BoundHandle = ThreadPoolBoundHandle.BindHandle(Handle);

        if (!Created)
        {
            Log.AttachedToQueue(_logger, requestQueueName);
        }
    }
Пример #5
0
 internal RequestQueue(string?requestQueueName, RequestQueueMode mode, ILogger logger)
     : this(requestQueueName, mode, logger, false)
 {
 }