2016-06-10 21 views
5

Khi IIS nhận được yêu cầu HTTP, nó sẽ gửi yêu cầu đến ứng dụng được yêu cầu trong một nhóm ứng dụng được phục vụ bởi một hoặc nhiều quy trình công nhân. Một quy trình công nhân sẽ sinh ra một luồng từ nhóm luồng được chia sẻ (nếu cần) để phục vụ yêu cầu http.Trình điều khiển Api Web và Hồ bơi Chủ đề

(i) Trong ngữ cảnh của bộ điều khiển api web, khi nhận được yêu cầu này, bộ điều khiển có được khởi tạo và gán cho luồng được sinh ra không?

(ii) Khi có nhiều yêu cầu http đến cùng bộ điều khiển api, sẽ có bao nhiêu phiên bản của bộ điều khiển cho mỗi chuỗi được sinh ra không?

(iii) Trong trường hợp tài nguyên không phải là chủ đề an toàn (dbContext) được khai báo ở cấp lớp và được khởi tạo trong một hàm dựng và sau đó được sử dụng trong các phương thức lớp. Sẽ có vấn đề cam kết và quản lý giao dịch?

Về bản chất, có sự so khớp từng đối một đối tượng điều khiển cho mỗi chuỗi không? (Tôi biết rằng với nhiều chủ đề asp.net có thể thực sự phục vụ một yêu cầu http đơn lẻ).

Trả lời

3

(i) Trong ngữ cảnh của bộ điều khiển api web, khi yêu cầu này là nhận được, bộ điều khiển có được khởi tạo và gán cho chủ đề được tạo ra không? (ii) Khi có nhiều yêu cầu http đến cùng một bộ điều khiển api, sẽ có bao nhiêu phiên bản của bộ điều khiển cho mỗi chuỗi được sinh ra?

Khi nhận được yêu cầu, cá thể bộ điều khiển được tạo bởi ControllerFactory hoặc DependencyResolver.

Về cơ bản, luồng chính tạo ra một cá thể bộ điều khiển, và sau đó cùng một cá thể được chia sẻ giữa nhiều luồng cho đến khi yêu cầu được hoàn thành.

(iii) Trong trường hợp mà một tài nguyên mà không phải là chủ đề an toàn (dbContext) được khai báo ở cấp lớp và thuyết minh trong một constructor và sau đó được sử dụng trong các phương thức lớp. Sẽ có vấn đề cam kết và quản lý giao dịch?

Có, thành viên chia sẻ hoặc tĩnh không an toàn. Tuy nhiên, các biến cục bộ bên trong các phương thức hành động là luồng an toàn.

+0

Vì vậy, nó có ý nghĩa để khởi tạo một dbcontext trong các phương thức hành động và tái sử dụng chúng với nhiều phiên bản của các kho khác nhau trong phạm vi của phương thức hành động. Tôi đã thử điều này rồi và nó hoạt động :). Nhưng tôi lo ngại về bất kỳ mùi mã nào ... –

1

Trả lời các câu hỏi của bạn theo điểm:
(i). Có
(ii). Không. Bộ điều khiển thông thường là singleton chứ không phải là chủ đề an toàn. Bạn tạo nhiều luồng để xử lý nhiều yêu cầu nhưng chúng cùng một cá thể bộ điều khiển giống nhau (hoặc dịch vụ)
(iii). Vâng. Trách nhiệm của bạn là chăm sóc kiểm tra độ an toàn dữ liệu hoặc các mối quan tâm về an toàn chủ đề. Nếu bạn không thì bạn có thể phải đối mặt với tất cả các loại vấn đề như bẩn đọc, bẩn đi xe, an toàn chủ đề ... tất cả các loại vấn đề an toàn chủ đề.

Bạn có thể coi bộ điều khiển là dịch vụ để chỉ ủy nhiệm các yêu cầu đến các dịch vụ con mới hoặc bộ điều khiển bằng cách tạo cá thể mới như tạo trình xử lý tác vụ mới cho mỗi yêu cầu NHƯNG bạn vẫn cần phải suy nghĩ về an toàn luồng của tài nguyên được chia sẻ như Cơ sở dữ liệu .

+0

bạn có chắc chắn về câu trả lời của mình (ii) không? trên trang này https://docs.microsoft.com/vi-us/aspnet/web-api/tổng quan/nâng cao/phụ thuộc-tiêm trạng thái: "Bộ điều khiển được tạo theo yêu cầu". nhưng có lẽ tôi hiểu nhầm bạn – schmendrick

Các vấn đề liên quan