Reputation: 3491
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 :
What do I for correcting this error?
I updated Web.config : But my problem not resolved!
Upvotes: 3
Views: 14934
Reputation: 27904
For future readers.
You need to make sure the web SITE has the binding "net.pipe" added.
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
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 ?>
Upvotes: 1
Reputation: 755157
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
Upvotes: 3