簡體   English   中英

如何在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”。

編輯綁定

以上可以在這里詳細看到:

通過IIS將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM