WebApi และใช้ Swagger

ฉันได้ใช้งานโปรเจ็กต์ WebApi ที่มี swashbuckle/swagger และ DelegatingHandler แบบกำหนดเอง ฉันได้เพิ่ม SwaggerAccessMessageHandler เพื่อตรวจสอบว่ามีการร้องขอผยองหรือไม่ ซึ่งในกรณีนี้ฉันไม่ต้องการให้ตัวจัดการแบบกำหนดเองทำงาน

ฉันได้ลงทะเบียนตัวจัดการข้อความเป็น

GlobalConfiguration.Configuration.MessageHandlers.Add(new SwaggerAccessMessageHandler());

ด้วยการใช้งานแบบกำหนดเองของ:

public class SwaggerAccessMessageHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (IsSwagger(request))
        {
            var response = request.CreateResponse(HttpStatusCode.Unauthorized);
            return Task.FromResult(response);
        }
        else
        {
            return base.SendAsync(request, cancellationToken);
        }
    }

    private bool IsSwagger(HttpRequestMessage request)
    {
        return request.RequestUri.PathAndQuery.StartsWith("/swagger");
    }
}

แต่เมื่อฉันสามารถ WebApi ด้วย /swagger ฉันจะได้รับหน้าว่างแทนที่จะเป็น ui ที่ผยอง

อัปเดต: ตกลงฉันได้ลบตัวจัดการ Swagger ออกแล้ว ฉันได้เพิ่ม AuthenticationHandler ใหม่ซึ่งจะตรวจสอบ userKey ที่ถูกต้องในสตริงการสืบค้นคำขอที่เข้ามา ฉันไม่สามารถเข้าถึงผยองได้ในขณะนี้ มีวิธีแก้ไขหรือไม่ ดังนั้นเมื่อฉันต้องการเข้าถึงผยอง ตัวจัดการแบบกำหนดเองของฉันจะไม่ถูกเรียก


person wakthar    schedule 14.07.2017    source แหล่งที่มา
comment
โปรดดูการอัปเดตด้านบน   -  person wakthar    schedule 14.07.2017


คำตอบ (1)


คุณมีหน้าว่างเนื่องจากคุณใช้บริการ REST และคุณไม่ได้พูดอะไรในร่างกาย เบราว์เซอร์ของคุณจะส่งคืนส่วนหัว 401 ซึ่งผู้ใช้ไม่สามารถมองเห็นได้ คุณต้องเปลี่ยนการตอบสนองต่อสิ่งต่อไปนี้

var response = request.CreateResponse(HttpStatusCode.Unauthorized,"You are not authorized");

อัปเดต UPDATE: Ok I have removed the Swagger handler for now. I have added a new AuthenticationHandler which checks for a valid userKey in the incoming request querystring. I cannot access swagger now. Is there a way around this so when I want to access swagger my custom handler is not called? ไม่มีการดำเนินการ DelegatingHanlers เป็นจุดเริ่มต้น ติดตามวิธีการทำงานของ webapi Pipeline:
ป้อนคำอธิบายรูปภาพที่นี่

ดังที่คุณอาจทราบว่าคุณไม่สามารถควบคุมไปป์ไลน์เพื่อเลี่ยงผ่านตัวจัดการข้อความใดๆ ได้ ใน AuthenticationHandler ของคุณ คุณต้องตรวจสอบว่า PathAndQuery ของคุณมีผยองหรือไม่ เพียงดำเนินการต่อไปนี้

base.SendAsync(request, cancellationToken);
person BRAHIM Kamel    schedule 14.07.2017