2013-04-17 38 views
15

Ứng dụng của tôi sử dụng tính năng Tự lưu trữ của Nancy. Khi tôi khởi động nó mà không có quyền admin tôi nhận được một System.Net.HttpListenerException "Truy cập bị từ chối".không thể tự khởi động máy chủ nancy mà không có quyền quản trị

Đây là mã:

static void Main(string[] args) 
    { 
     var nancyHost = new Nancy.Hosting.Self.NancyHost(new Uri("http://localhost:80/")); 
     nancyHost.Start(); 
     Application.Run(); 
    } 

Tôi cũng đã thử các cổng khác nhau mà không thành công. Kỳ lạ thay, tôi không nhận được bất kỳ ngoại lệ nào khi khởi chạy một HttpListener lắng nghe cùng một Url. Điều gì có thể gây ra ngoại lệ này?

+0

Có điều gì đó đang chạy trên cổng 80 chưa? –

+1

Tôi nghĩ thử nghiệm 'HttpListener' của bạn là thiếu sót. Tôi nhận được truy cập bị từ chối trong '.GetContext()' khi tôi không nâng lên trên cửa sổ 7. –

+0

Vâng tất nhiên theres một số logic ứng dụng nhiều hơn trong Programm của tôi. Và toàn bộ ứng dụng hoạt động hoàn hảo với Webserver "tự xây dựng" được xây dựng xung quanh HttpListener. Tôi chỉ muốn sử dụng nancy vì mở rộng, vv Nhưng phải bắt đầu nó với quyền quản trị có thể là một nogo cho khách hàng của chúng tôi. – kroax

Trả lời

40

Bạn cần đặt cấu hình tự lưu trữ để không ghi lại tuyến đường lưu trữ cục bộ.

namespace NancyApplication1 
{ 
    using System; 
    using Nancy.Hosting.Self; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var uri = 
       new Uri("http://localhost:3579"); 
      var config = new HostConfiguration(); 
      config.RewriteLocalhost = false; 

      using (var host = new NancyHost(config, uri)) 
      { 
       host.Start(); 

       Console.WriteLine("Your application is running on " + uri); 
       Console.WriteLine("Press any [Enter] to close the host."); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

Tôi thấy điều này ra bằng cách cố gắng và thất bại một chút, nhưng this page explains the reason behind.

+0

Làm việc như một sự quyến rũ. – ritcoder

+0

Nhưng nó chỉ cho phép tôi truy cập địa chỉ từ 'localhost' thay vì ip của máy, hoặc máy khách sẽ thấy lỗi 400. Bạn có ý tưởng làm thế nào để sửa chữa điều đó? –

+0

@JeffreyZhao Hãy xem câu trả lời của Ashtonian. – robpvn

4

Ngoài - Từ documentation:

Lưu ý rằng trên Windows tổ chức một HttpListenerException có thể được ném với một Access Denied thông điệp. Để giải quyết điều này, URL phải được thêm vào ACL. Ngoài ra, có thể cần phải mở cổng trên máy hoặc tường lửa của công ty để cho phép truy cập dịch vụ.

Thêm vào ACL bằng cách chạy lệnh sau:

netsh http add urlacl url=http://+:8080/ user=DOMAIN\username 

nếu bạn cần phải loại bỏ từ ACL:

netsh http delete urlacl url=http://+:8080/ 
0

Bạn có thể lưu trữ Nancy với Kestrel. Nó thực sự đơn giản:

public void Main(string[] args) 
{ 
    var owinHost = new WebHostBuilder() 
     .UseStartup<Startup>() 
     .UseUrls("http://+:12345/") 
     .Build(); 

    owinHost.Run(); 
} 

public class Startup 
{ 
    public void Configure(IApplicationBuilder app) 
    { 
     app.UseOwin(x => x.UseNancy()); 
    } 
} 

Khó khăn duy nhất là chuẩn bị tất cả các dll (30+) bắt buộc. Chúng ta chắc chắn nên sử dụng NuGet để giải quyết tất cả các phụ thuộc.

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