【问题标题】:WCF Service Library only works when run from Visual StudioWCF 服务库仅在从 Visual Studio 运行时才有效
【发布时间】:2011-06-28 13:06:29
【问题描述】:

我正在学习 WCF。我有一个 ASP.NET MVC2 Web 应用程序,我想从应用程序发送 mime 格式的电子邮件,所以我想我会将电子邮件功能封装在一个单独的 WCF 项目中以供将来重用等。因此我添加了一个 WCF 服务库到解决方案,对电子邮件功能进行编码,向 Web 项目添加服务引用,并且在 VS 中运行时一切正常。但是,如果我从浏览器窗口(而不是通过 Visual Studio 'F5')访问 Web 应用程序,则 WCF 服务将不起作用。我收到以下错误:

无法连接到远程服务器 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& 上下文)在 System.Net.HttpWebRequest.GetRequestStream() 在 System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream() 无法建立连接,因为 目标机器主动拒绝 127.0.0.1:8732 在 System.Net.Sockets.Socket.DoConnect

Web 应用程序中的 web.config 文件已修改(由 WCF)如下:

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_IEmailService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8732/Design_Time_Addresses/Email/EmailService/"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IEmailService"
        contract="EmailServiceReference.IEmailService" name="WSHttpBinding_IEmailService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

我需要做什么才能让应用程序+服务在 VS2010 之外工作?此外,当我最终部署到我们的服务器时,我们将不胜感激任何部署提示。

谢谢。

编辑 感谢所有的答案。鉴于我要在 Web 上部署它,我是否应该创建一个单独的 Web 应用程序或 Web 服务,然后引用服务库,然后在适当的时候将其部署到独立的 Web 服务器?

【问题讨论】:

    标签: c# visual-studio wcf web-applications


    【解决方案1】:

    如果您将服务部署到本地计算机,很可能是运行该服务的端口被防火墙阻止,或者您正在查看错误的端口。部署服务时不要忘记,端口可能与开发环境使用的不同。

    此外,也许更重要的是,您是否真的将服务部署到本地计算机上?当开发环境运行 (F5) 时,它会启动一个小版本的 IIS 来运行您的服务。当您尝试在开发环境之外运行它时不会发生这种情况。您需要在某处部署 WCF 服务(用于测试的机器或另一台机器)。然后您将知道它正在侦听的端口,并且您可以正确连接您的环境。听起来您可能没有完成导致问题的那一步。

    这是一个关于如何部署 WCF 服务的精彩演练教程:

    http://www.dotnetspark.com/kb/1679-how-to-host-wcf-services-tutorial.aspx

    【讨论】:

      【解决方案2】:

      原因是当您使用 F5 运行时,您的 wcf 服务会自动托管 WcfSvcHost.exe。但是,当通过 localhost(没有托管 havign wcf 服务)直接访问网页时,您会收到此错误。您需要做的是首先在 IIS(或其他任何地方)中托管 wcf,然后使用 Web 应用程序。

      Here 是托管 wcf 服务的选项。

      【讨论】:

      • 要解决这个问题,并且考虑到我最终想要部署到独立于主 Web 应用程序的 Web 服务器,我是否应该创建第三个 VS 项目(网站项目)(并添加到此解决方案) 哪个充当 WCF 服务的主机?打包 WCF 服务以便我可以在本地和生产 Web 服务器上运行的最佳方法是什么?谢谢
      • 你的想法是正确的。您可以将您的网站和 wcf 服务打包在两个不同的虚拟目录中。但请记住,选择 IIS 来托管 WCF 会限制传输协议。但考虑到您的情况,这应该没什么大不了的。
      【解决方案3】:

      WCF 服务库只是 WCF 服务类、合同等的项目。它不是服务。当您从 Visual Studio 运行应用程序时,它会看到该服务并将其托管在 WcfSvcHost.exe(用于开发的帮助工具)中,但在实际运行的情况下you must host the service yourselves

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多