[英]Set ServiceBehavior on channelfactory WCF Net.Pipe
[英]How is use of net.Pipe binding in WCF
我有一個使用Wcf服務的項目。 在我的web.config中綁定是:
<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].
我的項目的屬性是:
我該如何糾正這個錯誤?
我更新了Web.config:但我的問題沒有解決!
正如錯誤消息非常清楚地說明:您沒有為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
對於未來的讀者。
您需要確保Web SITE添加了綁定“net.pipe”。
以上可以在這里詳細看到:
而你需要使Web應用程序的協議
協議也可以通過命令行設置。 沿着下面的線條。 找一些其他的例子,我把它作為評論,而不是實際的代碼。 但它會“讓你到那里”。 請注意,“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。 下面是我的工作.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>
附加:
appcmd set site /site.name:" IIS中的網站名稱“/+bindings.[protocol='net.pipe',bindingInformation='*']
從
https://www.digicert.com/ssl-support/ssl-host-headers-iis-7.htm
這應該讓你在正確的方向上進行命令行添加綁定。
這里有一些Wix自定義動作代碼(主要是我在互聯網上找到的調整版本)
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>
和wix“屬性”。
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>
然后我在標簽內嵌套了下面的內容。
<?include MyProperties.wxi ?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.