我已经使用Visual Studio 2017的WCF模板创建了一个测试服务。它使用此应用程序配置文件创建了一个库项目:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- Al implementar el proyecto de la biblioteca de servicios, el contenido del archivo de configuración se debe agregar al archivo
app.config del host. La configuración del sistema no admite archivos de configuración en las bibliotecas. -->
<system.serviceModel>
<services>
<service name="Dummy.Service1">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/Design_Time_Addresses/Dummy/Service1/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- A menos que esté completa, la dirección está en relación con la dirección base suministrada anteriormente -->
<endpoint address="" binding="basicHttpBinding" contract="Dummy.IService1">
<!--
Antes de la implementación, se debe quitar o reemplazar el siguiente elemento de identidad para reflejar la
identidad bajo la que funciona el servicio implementado. Si se quita, WCF deducirá automáticamente una identidad
apropiada.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- El servicio utiliza el extremo de intercambio de metadatos para describirse a sí mismo ante los clientes. -->
<!-- Este extremo no utiliza un enlace seguro, por lo que se debe proteger o quitar antes de la implementación -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- Para evitar revelar información de los metadatos,
establezca los valores siguientes en false antes de la implementación -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración,
establezca el valor siguiente en true. Para no revelar información sobre las excepciones
establézcalo en false antes de la implementación -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
然后,我在服务中使用相同的应用程序配置文件,更改所需的信息。应用程序配置文件是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<!--WCF-->
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- Al implementar el proyecto de la biblioteca de servicios, el contenido del archivo de configuración se debe agregar al archivo
app.config del host. La configuración del sistema no admite archivos de configuración en las bibliotecas. -->
<system.serviceModel>
<services>
<service name="GestorAplicaciones.Wcf.Servicio.Net.GestorAplicacionesService">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/GestorAplicaciones" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- A menos que esté completa, la dirección está en relación con la dirección base suministrada anteriormente -->
<endpoint address="" binding="basicHttpBinding" contract="GestorAplicaciones.Wcf.Comun.Net.IGestorAplicacionesService">
<!--
Antes de la implementación, se debe quitar o reemplazar el siguiente elemento de identidad para reflejar la
identidad bajo la que funciona el servicio implementado. Si se quita, WCF deducirá automáticamente una identidad
apropiada.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- El servicio utiliza el extremo de intercambio de metadatos para describirse a sí mismo ante los clientes. -->
<!-- Este extremo no utiliza un enlace seguro, por lo que se debe proteger o quitar antes de la implementación -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- Para evitar revelar información de los metadatos,
establezca los valores siguientes en false antes de la implementación -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración,
establezca el valor siguiente en true. Para no revelar información sobre las excepciones
establézcalo en false antes de la implementación -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<!--FIN WCF-->
</configuration>
最后,我有一个WPF应用程序来托管服务。后面代码中的代码是这样的:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
using (_host = new ServiceHost(typeof(GestorAplicacionesService)))
{
_host.Open();
}
}
private ServiceHost _host;
}
运行WPF应用程序时,出现无法注册URL的错误。
中找到了一些解决方案总而言之,一种解决方案是使用管理员权限运行Visual Studio,另一种解决方案是使用netsh设置URL,但是我真的想这样做,因为如果Dummy项目使用WCF模板不需要这样做,因为服务已创建。
也许,像Dummy项目一样,它是一个库项目,当我在Visual Studio中运行时,Visual Studio创建一个自定义环境然后可以运行它,但是我想知道我的项目中是否真的可以解决这个问题没有使用netsh或以管理员权限运行的问题。
谢谢。
答案 0 :(得分:0)
在Visual Studio中调试应用程序时,右键单击Visual Studio>以管理员身份运行>打开项目并运行服务。这是一个与特权有关的问题。
在目标计算机上也使用netsh add urlacl
cmd:
netsh add urlacl url=http://+:8000/HelloWCF/ user=DOMAIN\user
我希望会有用!