首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WCF中使用net.Pipe绑定

如何在WCF中使用net.Pipe绑定
EN

Stack Overflow用户
提问于 2011-12-29 19:29:33
回答 2查看 14.4K关注 0票数 3

我有一个使用Wcf服务的项目。我的web.config中的绑定是:

代码语言:javascript
复制
<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>

当我想要创建服务主机时,我遇到运行时错误

代码语言:javascript
复制
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 :但是我的问题没有解决!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-29 19:37:19

正如错误消息清楚地指出的那样:您没有为net.pipe绑定定义任何基址。所以定义一个吧!

代码语言:javascript
复制
<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

票数 3
EN

Stack Overflow用户

发布于 2017-02-03 06:48:38

给未来的读者。

您需要确保网站添加了绑定"net.pipe“。

上面的详细信息可以在这里看到:

Binding net.pipe to Default Web Site via IIS

您需要启用web应用程序的协议

协议也可以通过命令行进行设置。类似于下面的内容。找到一些其他的例子,我把这个作为注释,而不是实际的代码。但它会“带你到那里”。请注意,",net.tcp“不是必需的。

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

我还没有弄清楚第一个(通过命令行)。如果我弄清楚了,我会在这里更新的。这是一个“一次”“在蓝月亮”的设置,所以我手动做了很多次。

请注意,我不是在设置baseAddress。下面是我的工作.config

代码语言:javascript
复制
<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>

追加:

从…

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

这应该会让你走上命令行添加绑定的正确方向。

以下是一些kicks的Wix自定义动作代码(主要是我在互联网上找到的调整版本)

代码语言:javascript
复制
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

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Web.Administration" version="7.0.0.0" targetFramework="net45" />
</packages>

和wix“属性”。

MyProperties.wxi

代码语言:javascript
复制
<?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>

然后我在标签中嵌套了下面的代码。

代码语言:javascript
复制
<?include MyProperties.wxi ?>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8667311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档