2011-11-10 4 views
0

서로 다른 iis 바인딩/호스트 이름을 가진 하나의 IIS 사이트에서 여러 사이트 그룹 (다른 클라이언트에 속한 그룹)이 실행되는 saas 서비스가 있습니다.코드에서 IIS 내 wcf 서비스 만들기

문제는 사이트에서 WCF 서비스를 사용할 수 있으며 실행 중인지 여부입니다 .net3.5 동일한 프로토콜을 사용하는 여러 기본 주소를 가질 수 없습니다. 나는 .net4와 enable this으로 업그레이드 할 수 있었지만 현재 가지고있는 서비스를 시작하기를 원합니다. 현재 그룹당 하나의 사이트가 있으며 업그레이드를 진행할 필요가 없습니다.

저는 코드 (두 가지 시도)로 서비스를 작성하여이 작업을 시도했습니다. 이것은 서비스가 언제 그리고 어디에서 생성되는지 (그리고 web.config에서 거의 변하지 않는 wcf 설정의 덩어리를 제거함) 완전한 제어권을 제공합니다.

원래 시도 :

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이 실행되지 않고 원하는 URL에서 서비스를 사용할 수없는 빈 화면이 나타납니다.

는 요약 문제는 다음과 같습니다
  • (I 오히려 기록하고 WCF 서비스를 실행하는 각 사이트에 대해 할 필요가 없습니다 거라고 구성 변화 인) netsh 명령을 실행하는

    1. 필요

    가 @Nick Nieslanik I B의 제안을 사용하여 시도

    에게 일 개정 asp.net 페이지를 나누기 유형을 말한다 다음은이 개정 시도는 문제가

    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 명령을 실행하는 데 필요한을 그
    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 명령을 실행하지 않음)

    here과 같이 동적 .svc 파일을 만드는 것이 다른 해결책이라고 생각합니다. 나는 그것을 줄 것이고 나의 결과를 게시 할 것이다. asp.net이 .svc 파일을 처리 할 때 AddressAlreadyInUseException을 피할 수있는 방법이 있기 때문에 요청할 때 .svc 파일을 처리하는 것처럼 보입니다.

    감사

    키스 ASP.NET UrlRouting를 사용하여 WCF 서비스 호스트를 회전 것 IRouteHandler 개체를 구현하는 것입니다 이러한 목표를 달성하기 위해

  • 답변

    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에 새로운 문제가 있습니다. –

    관련 문제