How is use of net.Pipe binding in WCF

14,407

Solution 1

As the error message says very clearly: you don't have any base address defined for the net.pipe binding. So define one!

<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>

Then your service endpoint would be net.pipe://localhost/Services/CommonServices

Solution 2

For future readers.

You need to make sure the web SITE has the binding "net.pipe" added.

Edit Bindings

The above can be seen in detail here:

Binding net.pipe to Default Web Site via IIS

And you need to enable the protocol of the web-application

Enabled Protocols

The protocols can be set via command line too. Something along the lines of the below. Find some other examples, I had this as a comment, not actual code. But it will "get you there". Note that ",net.tcp" is not required.

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

I haven't figured out the first one yet (via a command line). I'll update here if I figure it out. It a "one time" "in a blue moon" setting, so I manually do it a lot of times.

Please note that I am NOT setting a baseAddress. Below is my working .config

<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:

appcmd set site /site.name:"Name of Website in IIS" /+bindings.[protocol='net.pipe',bindingInformation='*']

from

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

That should get you in the right direction for command line add-binding.

Here is some Wix custom action code for kicks (mainly a tweaked version of what I've found on the internet)

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>

and wix "Properties".

MyProperties.wxi

<?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>

Then I nested the below inside the tag.

<?include MyProperties.wxi ?>
Share:
14,407
Ehsan
Author by

Ehsan

Updated on September 02, 2022

Comments

  • Ehsan
    Ehsan over 1 year

    I have a project using Wcf Service. Binding in my web.config is :

    <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>
    

    I have a runtime error when I want create service Host

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

    Message of Exception is :

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

    Properties of my project is : enter image description here

    What do I for correcting this error?

    I updated Web.config : But my problem not resolved!

    enter image description here enter image description here enter image description here