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 中无效
WCF:在 VS2010 中自动禁用 MEX 从 DEBUG 到 RELEASE 构建?