2009-02-22 290 views
11

我在使用IIS中的WebServiceHostFactory時遇到問題。WebServiceHostFactory和IIS身份驗證

「IIS指定的身份驗證方案」IntegratedWindowsAuthentication,Anonymous「,但該綁定僅支持指定恰好一個身份驗證方案有效的身份驗證方案爲摘要,協商,NTLM,基本或匿名更改IIS設置,單一認證方案被使用。「

I wanted to keep both authentication schemes and managed to do so by not using the factory but setting up the endpoint manualy in web.config.

我的問題是什麼WebServiceHostFactory做得到這個結果呢?我的印象是WebServiceHostFactory會將綁定設置爲我在配置中使用的同一個webHttpBinding。

編輯: 我已經看過反射器中的WebServiceHostFactory,它沒有做任何聰明的事情。它只是WebServiceHost的一個簡單工廠。

如果您在config中設置了端點,IIS是否還在使用服務主機?或者是WebServiceHost設置不同。

回答

3

這是爲我工作。在如下所示的早期(在服務主機打開之前)添加一個虛擬端點似乎已經成功了。 (這MSDN文章暗示了這http://msdn.microsoft.com/en-us/library/bb412178.aspx)。

public class MyWebServiceHost : WebServiceHost 
{ 
    public MyWebServiceHost (Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) 
    { 
     // Inserting this dummy endpoint config seemingly does the trick: 
     AddServiceEndpoint(typeof(IMyContract), new WebHttpBinding(), string.Empty); 
    } 

    protected override void ApplyConfiguration() 
    { 
     // Typical programmatic configuration here per: 
     // http://msdn.microsoft.com/en-us/library/aa395224.aspx 
    } 
} 

我猜這可以防止WebServiceHost從創建一個默認的端點,從而關閉了一堆功能。在web.config-

1

我不確定WebServiceHostFactory,但它聽起來像你在IIS內託管服務,並且它有多個選擇的驗證方法。如果您有IIS 5或6,請嘗試進入IIS並查看包含您的服務的網站或虛擬目錄的屬性。轉到目錄安全性選項卡,單擊「匿名訪問和身份驗證控制」下的編輯按鈕,然後取消勾選「匿名訪問」或「集成Windows身份驗證」。我不確定IIS7。

+1

問題與那就是你再**不能調試匿名訪問**網站。一個**不能令人滿意的**解決方法是使用單個身份驗證進行編譯,然後在IIS中調試另一個身份驗證之前進行調試。這有效,但時間浪費和煩人。我已經看到.NET 3.5網站多年來一直沒有發生過這個問題。對於.NET 4站點,我的經驗更糟。 _(有可能從MSBuild文件中改變網站身份驗證,但我找不到一個現成的任務來做到這一點。)_ – 2011-09-29 02:25:47

+0

爲我做了詭計,很棒的發現! – Adi 2012-02-13 16:01:36

+1

對不起,但據說他想保持兩種身份驗證方案......您的回答在這方面沒有幫助。 – LDAdams 2012-03-01 15:32:11

1

在IIS7下,您可能找不到可以在哪裏管理集成Windows身份驗證設置。爲了查看IIS7管理控制檯中的設置,需要遵循以下文章中描述的步驟:http://msdn.microsoft.com/en-us/library/x8a5axew.aspx(標題爲「錯誤:由於未啓用集成Windows身份驗證而導致調試失敗」,如果鏈接不起作用)。

希望它有幫助。

-1

禁用安全>配置標記

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding> 
      <security mode="None"> 
      <transport clientCredentialType="Windows"/> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    </system.serviceModel> 

那麼你的WCF服務不需要身份驗證...