2011-11-10 50 views
0

我有一個saas服務,它具有多個站點(每個組屬於一個不同的客戶端)在一個IIS站點中運行,並且具有不同的iis綁定/主機名,那麼這就是計劃。在代碼中創建IIS中的wcf服務

問題是我有WCF服務的網站,以及他們正在運行.net3.5我不能有多個基地址使用相同的協議。我可以升級到.net4和enable this,但我更願意只啓動我必須提供的服務,目前每組只有一個站點,而且不必提前升級。

我一直在嘗試通過在代碼中創建服務來做到這一點(以下兩次嘗試)。這使我可以完全控制創建服務的時間和地點(以及從web.config中刪除幾乎不會改變wcf config的塊)。

原始嘗試:

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.Web; 

[ServiceContract(Namespace = "WcfInIis")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Tiny 
{ 
    [OperationContract] 
    public bool IsTiny() 
    { 
     return true; 
    } 
} 

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     Uri requestUri = HttpContext.Current.Request.Url; 
     //some logic to decide if this context is allowed to run the wcf service requested 
     ServiceHost host = new ServiceHost(typeof(Tiny), new Uri(requestUri.OriginalString.Replace(requestUri.LocalPath, string.Empty))); 
     WSHttpBinding binding = new WSHttpBinding(SecurityMode.None); 
     host.AddServiceEndpoint(typeof(Tiny), binding, "_service/tiny"); 
     host.Open(); 
    } 
}

我的代碼的問題是,它運行時,我得到 AddressAccessDeniedException: HTTP could not register URL http://+:56134/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).]。顯然,這是在卡西尼運行,但我在IIS中運行時收到相同的消息。

當我按照鏈接並執行命令,它建議netsh http add urlacl url=http://+:56134/ user=domain\username我得到了一個空白的屏幕,因爲沒有任何asp.net執行和該服務不可用的預期網址。

總之,問題是:

  1. 需要運行netsh命令(這是一個配置的變化,我寧願不需要記錄,併爲運行WCF服務的每個站點)
  2. 打破了asp.net頁面

修訂嘗試

運用@Nick Nieslanik I b的建議uilt以下

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.Web; 
using System.Web.Routing; 

[ServiceContract(Namespace = "WcfInIis")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Tiny 
{ 
    [OperationContract] 
    public bool IsTiny() 
    { 
     return true; 
    } 
} 

public class ffServiceHandler : IRouteHandler, IHttpHandler 
{ 
    #region IRouteHandler Members 

    public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return this; 
    } 

    #endregion 

    #region IHttpHandler Members 

    public bool IsReusable 
    { 
     get { return false; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     Uri requestUri = context.Request.Url; 
     //some logic to decide if this context is allowed to run the wcf service requested 
     ServiceHost host = new ServiceHost(typeof(Tiny), new Uri(requestUri.OriginalString.Replace(requestUri.LocalPath, string.Empty))); 
     WSHttpBinding binding = new WSHttpBinding(SecurityMode.None); 
     host.AddServiceEndpoint(typeof(Tiny), binding, "_services/tiny"); 
     host.Open(); // throws AddressAlreadyInUseException 
    } 

    #endregion 
} 

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     RouteTable.Routes.Add(new Route 
     (
       "_services/tiny", 
       new ffServiceHandler() 
     )); 
    } 
}

經修訂的嘗試都有問題:

  1. 仍需要運行netsh命令(這是一個配置的變化,我寧願不需要記錄,併爲每個站點運行wcf服務)
  2. 我現在得到[AddressAlreadyInUseException: HTTP could not register URL http://+:56134/ because TCP port 56134 is being used by another application.]當我嘗試訪問該網站。這是由於該服務嘗試在站點運行的同一端口上啓動wcf服務所致。

摘要

誰能幫我把其中的一個工作,所以:

  1. WCF服務成功啓動
  2. 服務只在其完整的URL操作(不只是路徑)
  3. 不干擾asp.net頁面
  4. 不需要配置更改爲服務器(即未運行netsh命令)

我認爲一個替代解決方案可能是創建動態.svc文件所解釋here。我會放棄併發布我的結果。看起來這就是asp.net在請求時如何處理.svc文件,因爲如何避免AddressAlreadyInUseException?

感謝

基思做到這一點是使用ASP.NET UrlRouting和實施IRouteHandler對象,將旋轉起來的WCF服務主機

回答

0

的一種方式......

http://msdn.microsoft.com/en-us/library/system.web.routing.iroutehandler.gethttphandler.aspx

http://msdn.microsoft.com/en-us/library/cc668201.aspx

我已經在設置WCF數據時完成了這項工作服務,我不明白爲什麼它不能在這裏工作。

+0

感謝您的提示,我會試試看。 –

+0

@KeithK沒有問題,對不起,我沒有提供更詳細的信息,我走出了門。如果我今天得到一些時間,我會嘗試更充實地回答這個問題。 –

+0

剛剛更新我的問題,嘗試使用路由,但有一個AddressAlreadyInUseException新問題。 –