2011-12-29 3 views
3

Wcf 서비스를 사용하는 프로젝트가 있습니다. 내 Web.config의에 바인딩하는 것은 : 내가 서비스 호스트를 생성 할 때 WCF에서 net.Pipe 바인딩을 사용하는 방법

<netNamedPipeBinding> 
    <binding name="RCISPNetNamedPipeBinding" /> 
</netNamedPipeBinding> 

<service behaviorConfiguration="Fara.WcfServiceBehaviour" name="Fara.WcfService.CommonWcfService"> 
    <endpoint address="CommonServices" binding="netNamedPipeBinding" bindingConfiguration="FaraNetNamedPipeBinding" contract="Fara.Common.ServiceContract.ICommonService" /> 
</service> 

내가 런타임 오류가

public class ServiceFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     if (!IsInitialised) InitialiseService(); 
     return base.CreateServiceHost(serviceType, baseAddresses); 
    } 

} 

예외의 메시지는 다음과 같습니다의

Could not find a base address that matches scheme net.pipe for the endpoint with binding NetNamedPipeBinding. Registered base address schemes are [http].

속성 내 프로젝트 : enter image description here

이 오류를 해결하려면 어떻게해야합니까?

내가 업데이트의 Web.config : 을하지만 내 문제는 없습니다 해결!

enter image description here 오류 메시지로 enter image description here enter image description here

+0

[구성표 net.tcp 일치하는 기본 주소를 찾을 수 없습니다]의 사용 가능한 복제 (http://stackoverflow.com/questions/1793119/could-not-find-a-base-address-that- matches-scheme-net-tcp) –

답변

3

은 매우 명확 말한다 : 당신이 바인딩 net.pipe에 대해 정의 된 기본 주소가 없습니다. 그래서 하나를 정의하십시오!

<service name="Fara.WcfService.CommonWcfService" 
      behaviorConfiguration="Fara.WcfServiceBehaviour" > 
    <host> 
     <baseAddresses> 
      <add baseAddress="net.pipe://localhost/Services" /> 
     </baseAddresses> 
    </host> 
    <endpoint 
     address="CommonServices" 
     binding="netNamedPipeBinding" bindingConfiguration="FaraNetNamedPipeBinding" 
     contract="Fara.Common.ServiceContract.ICommonService" /> 
</service> 

그런 다음 서비스 엔드 포인트는 미래의 독자 net.pipe://localhost/Services/CommonServices

+0

이 문제를 Web.config에 추가했지만 문제가 해결되지 않았습니다! 내 질문이 업데이트되었습니다. – Ehsan

+4

@Ehsan : Visual Studio의 내장 웹 서버를 사용하여 net.pipe 바인딩을 사용하여 WCF 서비스를 ** 테스트 할 수 없습니다. 'ASP.NET Development Server'는'net.pipe'를 지원하지 않습니다 **. 서버 측에 자체 호스팅을 사용하거나 IIS에서 서비스를 호스팅해야합니다. –

+0

감사합니다. 다른 질문 하나. 'NetTcpBinding'을 사용하여 WCF 서비스를 테스트 할 수 있습니까? – Ehsan

1

이 될 것입니다.

웹 사이트에 "net.pipe"라는 바인딩이 추가되었는지 확인해야합니다.

Edit Bindings

여기에서 자세히 볼 수 있습니다 :

Binding net.pipe to Default Web Site via IIS

그리고을 사용하면 웹 응용 프로그램

Enabled Protocols

의 프로토콜을 활성화해야

프로토콜은 명령 줄에서도 설정할 수 있습니다. 아래 라인에 뭔가가 있습니다. 다른 예제를 찾아보십시오. 실제 코드가 아닌 주석으로 사용했습니다. 그러나 그것은 "당신을 거기에 데려다 줄 것"입니다. ", net.tcp"는 필요하지 않습니다.

appcmd.exe set config -section:system.applicationHost/sites "/[name='Default Web Site'].[path='/SunService'].enabledProtocols":"http,net.pipe,net.tcp" /commit:apphost 

(명령 줄을 통해) 아직 첫 번째 문자를 찾지 못했습니다. 내가 알아 내면 여기에서 업데이트 할 것이다. 그것은 "한 번에" "푸른 달에"설정, 그래서 나는 수동으로 그것을 많이 할.

baseAddress를 설정하지 않습니다. 아래는 내 일이다.설정

<services> 

    <service name="My.Concrete.MyService" 
      behaviorConfiguration="MyBehaviorOne" 
      > 

    <host> 
     <baseAddresses> 
     </baseAddresses> 
    </host> 


    <!-- IIS Address net.pipe://localhost/MyIISApplication/MyServiceFile.svc/SomeServiceNetNamedPipeAddressAbc --> 
    <endpoint 
       address = "SomeServiceNetNamedPipeAddressAbc" 
       binding = "netNamedPipeBinding" bindingConfiguration="NamedPipeBindingName1" 
       contract = "My.Interface.IMyService" > 
    </endpoint> 


    <endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" /> 


    </service> 


</services> 


<bindings> 

    <netNamedPipeBinding> 
    <binding name="NamedPipeBindingName1" 
       hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="9000000" 
       maxConnections="500" 
       maxReceivedMessageSize="9000000" 
       receiveTimeout="00:20:00" 
       transactionFlow="false"> 
     <security mode="Transport"> 
     </security> 
    </binding> 
    </netNamedPipeBinding> 


</bindings> 


<behaviors> 


    <behavior name="MyBehaviorOne"> 
     <!-- httpGetUrl is 'relative' in IIS --> 
     <serviceMetadata httpGetEnabled="true" httpGetUrl="Metadata" 
     httpsGetEnabled="false" /> <!-- httpGetUrl is 'relative' in IIS --> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 



</behaviors> 

APPEND :

는 '/+bindings.[protocol='net.pipe',bindingInformation='* "IIS에서 웹 사이트의 사이트 /site.name:"Name을 설정 APPCMD 명령어]

추가 결합 명령 행에 대한 올바른 방향으로 가야

https://www.digicert.com/ssl-support/ssl-host-headers-iis-7.htm

에서. 여기

은 차기에 대한 몇 가지 윅스 사용자 지정 작업 코드

using System; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Web.Administration; 

namespace MyCustomActionLibrary 
{ 
    public static class CustomActions 
    { 
     /// <summary> 
     /// Updates the binding for a Site. IIS. Right click a Site. Select "Edit Bindings" to see GUI of this. 
     /// </summary> 
     /// <param name="session">The session.</param> 
     /// <returns>An ActionResult</returns> 
     [CustomAction] 
     public static ActionResult UpdateBinding(Session session) 
     { 
      session.Log("Begin UpdateBinding"); 

      string siteName = session["SITE"]; 
      if (string.IsNullOrEmpty(siteName)) 
      { 
       session.Log("Property 'SITE' missing"); 
       return ActionResult.NotExecuted; 
      } 

      string bindingInformation = session["BINDINGINFORMATION"]; 
      if (string.IsNullOrEmpty(bindingInformation)) 
      { 
       session.Log("Property 'BINDINGINFORMATION' missing"); 
       return ActionResult.NotExecuted; 
      } 

      string bindingProtocol = session["BINDINGPROTOCOL"]; 
      if (string.IsNullOrEmpty(bindingProtocol)) 
      { 
       session.Log("Property 'BINDINGPROTOCOL' missing"); 
       return ActionResult.NotExecuted; 
      } 

      ActionResult result = ActionResult.Failure; 

      if (CheckRunAsAdministrator()) 
      { 
       session.Log("Start UpsertBinding."); 
       bool outcome = UpsertBinding(session, siteName, bindingInformation, bindingProtocol); 
       if (outcome) 
       { 
        result = ActionResult.Success; 
       } 

       session.Log("End UpsertBinding."); 
       return result; 
      } 
      else 
      { 
       session.Log("Not running with elevated permissions.STOP"); 
       session.DoAction("NotElevated"); 
       return ActionResult.Failure; 
      } 
     } 

     /// <summary> 
     /// Enables the protocols. Go to IIS. Pick a Site. Right Click an Application. Select "Manage Application"/"Advanced Settings". Find "Enabled Protocols" to see the GUI of this setting. 
     /// </summary> 
     /// <param name="session">The session.</param> 
     /// <returns>An ActionResult</returns> 
     [CustomAction] 
     public static ActionResult EnableProtocols(Session session) 
     { 
      session.Log("Begin EnableProtocols"); 

      string siteName = session["SITE"]; 
      if (string.IsNullOrEmpty(siteName)) 
      { 
       session.Log("Property 'SITE' missing"); 
       return ActionResult.NotExecuted; 
      } 

      string alias = session["VIRTUALDIRECTORYALIAS"]; 
      if (string.IsNullOrEmpty(alias)) 
      { 
       session.Log("Property 'VIRTUALDIRECTORYALIAS' missing"); 
       return ActionResult.NotExecuted; 
      } 

      string protocols = session["ENABLEDPROTOCOLS"]; 
      if (string.IsNullOrEmpty(protocols)) 
      { 
       session.Log("Property 'ENABLEDPROTOCOLS' missing"); 
       return ActionResult.NotExecuted; 
      } 

      try 
      { 
       if (CheckRunAsAdministrator()) 
       { 
        ServerManager manager = new ServerManager(); 

        var site = manager.Sites.FirstOrDefault(x => x.Name.ToUpper(CultureInfo.CurrentCulture) == siteName.ToUpper(CultureInfo.CurrentCulture)); 
        if (site == null) 
        { 
         session.Log("Site with name {0} not found", siteName); 
         return ActionResult.NotExecuted; 
        } 

        var application = site.Applications.FirstOrDefault(x => x.Path.ToUpper(CultureInfo.CurrentCulture).Contains(alias.ToUpper(CultureInfo.CurrentCulture))); 
        if (application == null) 
        { 
         session.Log("Application with path containing {0} not found", alias); 
         return ActionResult.NotExecuted; 
        } 

        session.Log("About to set EnabledProtocols. SITE='{0}', VIRTUALDIRECTORYALIAS='{1}', ENABLEDPROTOCOLS='{2}'.", siteName, alias, protocols); 
        application.EnabledProtocols = protocols; 
        manager.CommitChanges(); 
        session.Log("ServerManager.CommitChanges successful for setting EnabledProtocols. SITE='{0}', VIRTUALDIRECTORYALIAS='{1}', ENABLEDPROTOCOLS='{2}'.", siteName, alias, protocols); 

        return ActionResult.Success; 
       } 
       else 
       { 
        session.Log("Not running with elevated permissions.STOP"); 
        session.DoAction("NotElevated"); 
        return ActionResult.Failure; 
       } 
      } 
      catch (Exception exception) 
      { 
       session.Log("Error setting enabled protocols: {0}", exception.ToString()); 
       return ActionResult.Failure; 
      } 
     } 

     private static bool UpsertBinding(Session session, string sitename, string bindingInformation, string bindingProtocol) 
     { 
      bool result; 

      session.Log(string.Format("(SiteName)='{0}'", sitename)); 
      session.Log(string.Format("(BindingInformation)='{0}'", bindingInformation)); 
      session.Log(string.Format("(BindingProtocol)='{0}'", bindingProtocol)); 

      using (ServerManager serverManager = new ServerManager()) 
      { 
       Site site = serverManager.Sites.FirstOrDefault(x => x.Name.Equals(sitename, StringComparison.OrdinalIgnoreCase)); 

       if (null != site) 
       { 
        Binding foundBinding = site.Bindings.FirstOrDefault(b => b.Protocol.Equals(bindingProtocol, StringComparison.OrdinalIgnoreCase) && b.BindingInformation.Equals(bindingInformation, StringComparison.OrdinalIgnoreCase)); 

        if (null == foundBinding) 
        { 
         //// add bindings 
         session.Log("About add to Site.Bindings. SITE='{0}', BINDINGINFORMATION='{1}', BINDINGPROTOCOL='{2}'.", sitename, bindingInformation, bindingProtocol); 
         site.Bindings.Add(bindingInformation, bindingProtocol); 
         serverManager.CommitChanges(); 
         session.Log("ServerManager.CommitChanges successsful for adding to Site.Bindings. SITE='{0}', BINDINGINFORMATION='{1}', BINDINGPROTOCOL='{2}'.", sitename, bindingInformation, bindingProtocol); 
         result = true; 
        } 
        else 
        { 
         session.Log(string.Format("Binding already exists. (SiteName='{0}', bindingInformation='{1}', bindingProtocol='{2}')", sitename, bindingInformation, bindingProtocol)); 
         result = true; /* do not fail if the binding already exists, the point is to have the binding */ 
        } 
       } 
       else 
       { 
        session.Log(string.Format("Site does not exist. (SiteName) {0}.", sitename)); 
        result = false; 
       } 
      } 

      return result; 
     } 

     /// <summary> 
     /// Check that process is being run as an administrator 
     /// </summary> 
     /// <returns>if the process is being run as administrator</returns> 
     private static bool CheckRunAsAdministrator() 
     { 
      var identity = WindowsIdentity.GetCurrent(); 
      var principal = new WindowsPrincipal(identity); 
      return principal.IsInRole(WindowsBuiltInRole.Administrator); 
     } 
    } 
} 

packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.Web.Administration" version="7.0.0.0" targetFramework="net45" /> 
</packages> 

및 윅스 "속성"(내가 인터넷에서 발견 한 내용을 주로 쥐게 버전)입니다 .

<?xml version="1.0" encoding="utf-8"?> 
<Include> 
    <Property Id="SITE" Value="Default Web Site" /> 
    <Property Id="BINDINGINFORMATION" Value="*" /> 
    <Property Id="BINDINGPROTOCOL" Value="net.pipe" /> 

    <Property Id="VIRTUALDIRECTORYALIAS" Value="MyWebApplicationName" /> 
    <Property Id="ENABLEDPROTOCOLS" Value="http,net.pipe" /> 
</Include> 

MyProperties.wxi는 다음 나는 태그 내에 아래 중첩.

<?include MyProperties.wxi ?> 
관련 문제