2009-11-30 50 views
9

Tôi có một dịch vụ WCF đang chạy trong IIS gọi một hàm trong thư viện lớp nơi có httpContext. Làm thế nào tôi có thể tự động nhận được url của trang web, đây cũng có thể là một thư mục ảo?Dịch vụ WCF, cách lấy URL của trang web từ trong thư viện lớp học?

+0

Url cho dịch vụ WCF hoặc url cho trang web là nguồn của HttpContext? – Russell

+0

URL cho trang web lưu trữ dịch vụ WCF ...ví dụ: http: // localhost/virtualDirectory từ http: //localhost/virtualDirectory/myService.svc –

+0

Phiên bản IIS nào? IIS 6 hoặc 7 hoặc 7.5? WS có được triển khai không? –

Trả lời

4

Bạn có thể tạo ServiceHostFactory để khởi chạy máy chủ dịch vụ theo cách thủ công, sau đó lưu trữ địa chỉ điểm cuối trong một lớp tĩnh để ứng dụng của bạn sử dụng. Dưới đây là một ví dụ đơn giản:

(trong myService.svc của bạn):

<% 
@ServiceHost 
Service="MyNamespace.MyService" 
Factory="MyNamespace.MyServiceHostFactory" 
    %> 

(trong MyServiceHostFactory.cs của bạn):

/// <summary> 
/// Extends ServiceHostFactory to allow ServiceHostFactory to be used. 
/// </summary> 
public class MyServiceHostFactory : ServiceHostFactory 
{ 
    /// <summary> 
    /// Creates a new ServiceHost using the specified service and base addresses. 
    /// </summary> 
    /// <param name="serviceType"></param> 
    /// <param name="baseAddresses"></param> 
    /// <returns></returns> 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     ServiceHost host; 
     host = new ServiceHost(serviceType, baseAddresses); 

     MyGlobalStaticClass.Address = baseAddresses[0]; // assuming you want the first endpoint address. 

     return host; 
    } 

(Trong MyGlobalStaticClass.cs của bạn):

public static string Address = ""; 
2

Tôi không quá nóng trên WCF vì tôi quen với .Net 2.0, nhưng điều này có làm được không?

HttpContext.Current.Request.Url.ToString() 

Điều đó sẽ cung cấp cho bạn url của yêu cầu gọi. Việc nắm bắt ở đây là bạn có thể có thể có nhiều tên miền hoặc thư mục ảo trỏ đến cùng một dịch vụ và nó sẽ chỉ cung cấp cho bạn url mà khách hàng đã chỉ định. Tuy nhiên, nếu bạn có nhiều điểm vào, thì không có url "một" nào.

+1

Điều này cũng giả định ràng buộc WCF là basicHttpBinding hoặc HTTP ràng buộc các loại (ví dụ: netTcpBinding không có HttpContext). – Russell

25

Tôi sẽ bắt đầu bằng cách giả sử rằng bạn đang sử dụng HTTP - Tôi chắc chắn bạn có thể điều chỉnh cách tiếp cận tùy thuộc về điều kiện cụ thể của bạn ra lệnh. Tôi đã cố gắng để có được một câu trả lời bằng cách sử dụng HttpContext là tốt và phát hiện ra rằng giá trị là null khi chạy theo Cassini vì vậy tôi đã thử một cách tiếp cận thay thế.

System.ServiceModel.OperationContext chứa ngữ cảnh yêu cầu phù hợp. Bạn có thể làm theo yêu cầu xuống thông báo yêu cầu thực tế và chà tiêu đề.

Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To; 
3

Hiện tại tôi đang làm việc trên WCF REST Service và tôi có cùng loại yêu cầu. Tôi cần URL máy chủ dịch vụ theo một trong các phương pháp của tôi. Dưới đây là các cách khác nhau để lấy WCF REST Service Host/URL trong thư viện lớp.

Bạn có thể sử dụng WebOperationContext lớp có sẵn trong không gian tên System.ServiceModel.Web để nhận url dịch vụ. Xin lưu ý rằng lớp học này chỉ dành cho WCF REST Service.

  1. WebOperationContext.Current.IncomingRequest.Headers["host"] - Cung cấp dịch vụ Host Name

  2. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.Host - Cung cấp dịch vụ Host Name

  3. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri - Cung cấp dịch vụ đầy đủ Url

  4. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri - Cung cấp dịch vụ đầy đủ Url

Bạn có thể tìm thêm thông tin về WebOperationContext lớp học trên MSDN

+1

Đối với tôi, UriTemplateMatch luôn là null, vì vậy tôi không thể sử dụng 3/4 đề xuất này. –

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