我有一個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執行和該服務不可用的預期網址。
總之,問題是:
- 需要運行netsh命令(這是一個配置的變化,我寧願不需要記錄,併爲運行WCF服務的每個站點)
- 打破了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()
));
}
}
經修訂的嘗試都有問題:
- 仍需要運行netsh命令(這是一個配置的變化,我寧願不需要記錄,併爲每個站點運行wcf服務)
- 我現在得到
[AddressAlreadyInUseException: HTTP could not register URL http://+:56134/ because TCP port 56134 is being used by another application.]
當我嘗試訪問該網站。這是由於該服務嘗試在站點運行的同一端口上啓動wcf服務所致。
摘要
誰能幫我把其中的一個工作,所以:
- WCF服務成功啓動
- 服務只在其完整的URL操作(不只是路徑)
- 不干擾asp.net頁面
- 不需要配置更改爲服務器(即未運行netsh命令)
我認爲一個替代解決方案可能是創建動態.svc文件所解釋here。我會放棄併發布我的結果。看起來這就是asp.net在請求時如何處理.svc文件,因爲如何避免AddressAlreadyInUseException?
感謝
基思做到這一點是使用ASP.NET UrlRouting和實施IRouteHandler對象,將旋轉起來的WCF服務主機
感謝您的提示,我會試試看。 –
@KeithK沒有問題,對不起,我沒有提供更詳細的信息,我走出了門。如果我今天得到一些時間,我會嘗試更充實地回答這個問題。 –
剛剛更新我的問題,嘗試使用路由,但有一個AddressAlreadyInUseException新問題。 –