运行 来自管理员命令提示符的 WCF 服务器不工作
Running WCF Server From Admin Command Prompt Not Working
我正在尝试了解 WCF 服务并遵循此处的入门教程:https://docs.microsoft.com/en-us/dotnet/framework/wcf/how-to-host-and-run-a-basic-wcf-service
当我 运行 项目通过 visual studio 服务成功启动时,我可以通过访问位于 http://localhost:8000/GettingStarted/CalculatorService 的填充服务页面来验证这一点。
但是,当我以管理员身份启动命令提示符并导航到 bin 目录并执行 GettingStartedHost.exe 时,该页面不再显示。
是什么导致了这种差异?命令提示符下的 运行ning GettingStartedHost.exe 与 Visual Studio 有什么区别?
我希望能够从命令提示符而不是 visual studio 在本地主机上托管我的服务。
运行从具有管理权限的CMD服务和从Visual studio开始的服务没有区别。
鉴于官方文档太旧,我尝试重现你的问题。但我发现我们仍然可以从浏览器访问服务 class 库中的配置不再有效,Url 基地址和绑定类型采用控制台应用程序配置。基于 HttpGetEnabled 属性 的服务描述页面。因此,服务描述URL是服务基址URL而不是服务端点地址(http://localhost:8000/GettingStarted/CalculatorService)。
Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
ServiceHost selfHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1), baseAddress);
try
{
selfHost.AddServiceEndpoint(typeof(WcfServiceLibrary1.IService1), new WSHttpBinding(), "CalculatorService");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
下面是一个在控制台应用程序中托管服务而不引用任何其他项目的示例。希望对你有用。
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:21011");
BasicHttpBinding binding = new BasicHttpBinding();
using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Opened += delegate
{
Console.WriteLine("Service is ready");
};
sh.Closed += delegate
{
Console.WriteLine("Service is clsoed");
};
sh.Open();
Console.ReadLine();
//pause
sh.Close();
Console.ReadLine();
}
}
}
[ServiceContract]
public interface IService
{
[OperationContract]
string Test();
}
public class MyService : IService
{
public string Test()
{
return DateTime.Now.ToString();
}
}
然后我们访问服务定义页面,http://localhost:21011
如果有什么我可以帮忙的,请随时告诉我。
我正在尝试了解 WCF 服务并遵循此处的入门教程:https://docs.microsoft.com/en-us/dotnet/framework/wcf/how-to-host-and-run-a-basic-wcf-service
当我 运行 项目通过 visual studio 服务成功启动时,我可以通过访问位于 http://localhost:8000/GettingStarted/CalculatorService 的填充服务页面来验证这一点。
但是,当我以管理员身份启动命令提示符并导航到 bin 目录并执行 GettingStartedHost.exe 时,该页面不再显示。
是什么导致了这种差异?命令提示符下的 运行ning GettingStartedHost.exe 与 Visual Studio 有什么区别?
我希望能够从命令提示符而不是 visual studio 在本地主机上托管我的服务。
运行从具有管理权限的CMD服务和从Visual studio开始的服务没有区别。
鉴于官方文档太旧,我尝试重现你的问题。但我发现我们仍然可以从浏览器访问服务 class 库中的配置不再有效,Url 基地址和绑定类型采用控制台应用程序配置。基于 HttpGetEnabled 属性 的服务描述页面。因此,服务描述URL是服务基址URL而不是服务端点地址(http://localhost:8000/GettingStarted/CalculatorService)。
Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
ServiceHost selfHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1), baseAddress);
try
{
selfHost.AddServiceEndpoint(typeof(WcfServiceLibrary1.IService1), new WSHttpBinding(), "CalculatorService");
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
下面是一个在控制台应用程序中托管服务而不引用任何其他项目的示例。希望对你有用。
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("http://localhost:21011");
BasicHttpBinding binding = new BasicHttpBinding();
using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Opened += delegate
{
Console.WriteLine("Service is ready");
};
sh.Closed += delegate
{
Console.WriteLine("Service is clsoed");
};
sh.Open();
Console.ReadLine();
//pause
sh.Close();
Console.ReadLine();
}
}
}
[ServiceContract]
public interface IService
{
[OperationContract]
string Test();
}
public class MyService : IService
{
public string Test()
{
return DateTime.Now.ToString();
}
}
然后我们访问服务定义页面,http://localhost:21011
如果有什么我可以帮忙的,请随时告诉我。