net.tcp使用(显然)Solid .config <systerm.servicemodel>

时间:2016-09-19 23:44:14

标签: wcf visual-studio-2015 wcf-binding net.tcp iis-10

我想我已经尝试了所有方法,但我无法使用简单的net.tcp WCF服务,我需要一些帮助。我在Visual Studio 2015中有一个带有以下服务类的WCF net.tcp项目:

namespace AppRefactory.JdmCommSample
{
    public enum DocType { Labels, Releases, Artists }

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface ILabelOperations
    {

        [OperationContract]
        bool PassLabelProcess(string targetAddress, string hostCommand, MusicLabelContract musicLabel);

        // TODO: Add your service operations here
    }
}

以下实现了LabelProcess.svc文件中的服务:

namespace AppRefactory.JdmCommSample
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "MusicLabel" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select MusicLabel.svc or MusicLabel.svc.cs at the Solution Explorer and start debugging.
    public class LabelOperations : ILabelOperations
    {
        public bool PassLabelProcess(string targetAddress, string hostCommand, MusicLabelContract musicLabel)
        {
            throw new NotImplementedException();
        }
    }
}

我已经在web.config上对该服务进行了大量阅读,并使用ServiceModelReg.exe来帮助我 - 但以下是该服务项目的web.config的当前版本:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="epTcpBehavior">
          <endpointDiscovery />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviorConfig">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false"
            includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https"/>
        <add binding="netTcpBinding" scheme="net.tcp" bindingConfiguration="InsecureTcp" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <services>
      <service behaviorConfiguration="ServiceBehaviorConfig" name="AppRefactory.JdmCommSample.LabelOperations">
        <endpoint address="LabelService" binding="netTcpBinding" bindingConfiguration="InsecureTcp"
          name="LabelOperations" contract="AppRefactory.JdmCommSample.ILabelOperations" />
        <endpoint address="netTcpMex" binding="mexTcpBinding" bindingConfiguration="NewBinding0"
          name="NetTcpMEX" contract="IMetadataExchange" />
        <endpoint address="mexhttp" binding="mexHttpBinding" name="HttpMex"
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost/JdmCommSample/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="InsecureTcp" portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
      <mexTcpBinding>
        <binding name="NewBinding0" />
      </mexTcpBinding>
    </bindings>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking"/>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
        preCondition="managedHandler"/>
    </modules>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>

</configuration>

当我转到客户端项目并尝试添加服务引用时(在Visual Studio 2015中),我收到以下错误:

enter image description here

“发现”按钮在点击时不显示服务,因此我手动输入服务地址:net://localhost/JdmCommSample/LabelOperations.svc并点击“开始”按钮获得以下结果:

enter image description here

最后,我点击上面错误消息块(在对话框中)中的“详细信息”链接并获取以下内容:

添加服务引用错误对话:

  

无法识别URI前缀。   元数据包含无法解析的引用:'net.tcp://localhost/JdmCommSample/LabelOperations.svc'。   在net.tcp://localhost/JdmCommSample/LabelOperations.svc上没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。   如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

我现在已经收到相同的错误消息已经有一段时间了,并且无法弄清楚为什么客户端的元数据一直坚持使用服务的旧http://地址以及为什么它不接受网络。 tcp地址。

最后,我应该快速添加我使用以下作为我的开发环境:

  • Visual Studio 2015
  • Windows 10
  • IIS 10

...我花了很多时间尝试通过使用支持net.tcp的默认服务(包括和不包含http)修改IIS设置并在/ bin和编码文件夹中创建虚拟应用程序来解决此问题。为了支持交互式调试。上面最终对话中描述的错误消息发生了变化 - 但只是说我正在使用的net.tcp://地址是'不可用'。

再次,非常感谢您的帮助!!!

1 个答案:

答案 0 :(得分:1)

好的 - 所以看起来好像我已经解决了这个问题.....这里的问题是 - 我多年没有使用Visual Studio来配置net.tcp端点而且错误地结束了如果缺少曾经位于系统托盘中的WCF测试服务,则可以使用“添加服务引用”对话框来配置net.tcp链接。

根据MSDN Library关于通过Windows进程激活(WAS)设置net.tcp服务的文章,所有端点配置和服务引用都是使用手工制作或工具生成的代码(使用svcutil.exe)处理的。客户端 - 主要是在服务端手工制作的逻辑。

因此,我在这个帖子中的问题是由于期望不佳和错误信息造成的。道歉...

这里的下一步是创建一个单向服务方法,它将在客户端上抛出一个事件。我希望在这个主题的未来几天会有问题 - 如果有人有任何有用的链接分享这个主题,请不要自己保留! ;)