WCF 服务在 VS 中有效,但在构建中无效

Posted

技术标签:

【中文标题】WCF 服务在 VS 中有效,但在构建中无效【英文标题】:WCF service works in VS but not in build 【发布时间】:2020-01-23 01:07:24 【问题描述】:

我有一个 wcf 自托管服务,旨在供计算机和 android 手机使用。我成功地使服务在两个目标中都可以使用,但是当我构建一个 exe 文件(负责自托管服务)时,该服务在 pc 中运行良好,但在移动应用程序上却无法运行。 这是我的服务的 app.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding" maxBufferSize="128000000" maxReceivedMessageSize="128000000" />
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="webBinding" closeTimeout="00:02:00" sendTimeout="00:02:00"
          maxBufferSize="6553600" maxReceivedMessageSize="6553600" crossDomainScriptAccessEnabled="true" />
      </webHttpBinding>
    </bindings>
    <diagnostics performanceCounters="Default" />
    <services>
      <service name="DeltaService.Data">
        <endpoint address="data" binding="basicHttpBinding" bindingConfiguration="httpBinding"
          name="data" contract="DeltaService.IData">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="json" behaviorConfiguration="Rest" binding="webHttpBinding"
          bindingConfiguration="webBinding" name="restdata" contract="DeltaService.IData">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/delta_api/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="Rest">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" />
        </behavior>
        <behavior name="Web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <useRequestHeadersForMetadataAddress />
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment
      aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true"/>


  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

</configuration>

这是启动服务的代码:

serviceHost = new ServiceHost(typeof(Data));
NetHttpBinding netHttpBinding = new NetHttpBinding();
netHttpBinding.MaxReceivedMessageSize = 128 * 1000000; //128Mb
serviceHost.AddServiceEndpoint(typeof(IData), netHttpBinding, url);
erviceHost.Open();

【问题讨论】:

您的移动设备和服务器之间的 HTTP 活动是什么样的? 同一网络上的其他电脑可以访问该服务吗?移动设备如何连接到电脑(或同一个网络)?您的网络是什么样的? cors? blogs.msdn.microsoft.com/dsnotes/2016/08/31/… 可以,同一网络的其他电脑可以访问该服务,移动设备也连接到同一网络。 android 应用程序向服务发送 HTTP Json 请求并获得 JSON 响应。 在 Visual Studio 上按运行时服务正常,但是当我构建 exe 文件时,它不起作用,所以问题出在 app.config 文件或 self-托管应用程序。 【参考方案1】:

您似乎是通过使用其他托管程序来托管服务的。我们必须考虑的一件事是,在托管程序(例如 WinForms 应用程序)中托管服务时,我们不需要配置服务端点和绑定信息。 以这两种方式托管时存在区别。当我们在Visual Studio上运行托管服务时,系统会自动搜索服务配置,这样Appconfig文件中的配置就会生效,适当的绑定会生成不同种类的服务(restful和soap web服务)。但是在其他程序中托管服务时,使用 NetHttpBinding 的服务会与上述服务有所不同。 总之,我建议您在自托管程序中使用以下代码。

ServiceHost sh = new ServiceHost(typeof(Data));
            sh.Open();

它会自动在 Appconfig 文件中搜索服务配置,以便以适当的方式发布服务。 如果问题仍然存在,请随时告诉我。

【讨论】:

【参考方案2】:

您已将地址配置为localhost。该地址只能从您的计算机访问,而不能从外部访问。

当您托管您的服务时,请选择一个可以从外部访问的地址。由于我不知道您的设备在哪里,我不知道您需要多少“外部”。本地网络?广域网?请务必阅读相关教程并选择所需的地址或 DNS 条目。

【讨论】:

以上是关于WCF 服务在 VS 中有效,但在构建中无效的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 5 解决方案在 VS2013 中有效,但在 VS2015 中无效

JWT 功能在本地有效,但在 heroku 上无效

WCF:在 VS2010 中自动禁用 MEX 从 DEBUG 到 RELEASE 构建?

构建一个简单的WCF应用

JQuery $.post 在 VS 2010 实例中有效,但在我在 IIS 7.5 中部署时无效

相机在 Monaca Debugger 中有效,但在 Debug Build 中无效