2016-02-12 54 views
3

我想在我的WPF應用程序中實現一個簡單的自託管REST API,該API監聽localhost上的特定端口。如果它正在運行,該API將被網站使用以與WPF應用程序進行通信。沒有管理權限的localhost上的自託管REST API

沒過多久,我就遇到了System.ServiceModel.AddressAccessDeniedException錯誤。 URL必須保留,只有當進程以提升的特權運行時才能完成此操作。問題在於,這個應用程序在成千上萬的擁有不同IT策略的公司中使用,這使得應用程序每次啓動時都不可能需要管理權限。

這是我的測試代碼:

_task = Task.Factory.StartNew(() => 
    { 
     var uri = new Uri("http://localhost:5000/test"); 
     var type = typeof (TestService); 
     WebServiceHost host = new WebServiceHost(type, uri); 
     WebHttpBinding binding = new WebHttpBinding(); 
     binding.CrossDomainScriptAccessEnabled = true; 
     host.AddServiceEndpoint(type, binding, uri); 
     host.Open(); 
    }); 

是否有解決這個什麼方法?任何我可以使用的第三方軟件包?或者我可以在安裝應用程序時保留URL,因爲安裝需要提升權限?或者這是一個死衚衕?

回答

1

由於您試圖綁定到http://+:12345,其中+引用機器上的所有地址,因此您將獲得「拒絕訪問」。如果你明確綁定到localhost那麼(只要你使用一個未使用的端口號),你不應該有任何問題。

自從我上次使用WCF以來,它一直是(很長),所以我不記得相關的咒語。個人而言,如果我這樣做,我會調查類似NancyFX的東西,它比WCF更易於使用,但嚴格來說,本質上不支持REST,所以您需要在最佳。例如,請參閱http://engineering.laterooms.com/building-microservices-with-nancy-fx/

而且,如果您決定使用Nancy,在無需管理員權限的情況下偵聽本地計算機上的端口,您需要在配置中指定HostConfiguration.RewriteLocalhost(或者至少您上次執行了I使用NancyFX)。

+0

我用示例代碼更新了我的文章。我綁定localhost:5000/test。感謝關於NancyFX的提示。我會看看它! – sundown

+0

啊,你可能會認爲你對本地主機有約束力。仔細檢查WCF是否將其解釋爲「所有本地地址」。南希確實(或當我上次使用它時)。 –

+0

所以,我嘗試了南希,它工作得很好!讓它與我現有的溫莎城堡容器很好地搭配有點棘手,但我解決了它。再次感謝您的回答! 對於所有其他人,我敢肯定,這裏有更多的答案可以奏效。但我決定把這個標記爲答案。 – sundown

0

那麼,你不需要管理權限來啓動它。如果您無權使用該網址,則只需要他們。

ACLURL(工具)可用於安裝程序中授予用戶或程序的權利。那麼在運行時將不需要管理權限。

3

安裝時只要運行這個:

netsh http add urlacl url=http://+:5000/Test/ user=Everyone 

注意您可以從Everyone限制user到登錄的用戶如user=MyDomain\John

+1

可以=應該:)使用所需的最低特權來完成工作。至少對於非愛好項目:) – cwap