【问题标题】:Running WCF Server From Admin Command Prompt Not Working从管理员命令提示符运行 WCF 服务器不起作用
【发布时间】:2020-05-07 00:12:21
【问题描述】:

我正在尝试了解 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 时,页面不再显示。

什么可能导致这种差异?从命令提示符运行 GettingStartedHost.exe 与从 Visual Studio 运行有什么区别?

我希望能够通过命令提示符而不是 Visual Studio 在 localhost 上托管我的服务。

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    从具有管理权限的 CMD 运行服务和从 Visual Studio 启动服务没有区别。
    鉴于官方文档太旧,我尝试重现您的问题。但是我发现我们仍然可以从浏览器访问服务类库中的配置不再有效,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
    如果有什么我可以帮忙的,请随时告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2014-11-23
      • 2021-06-14
      相关资源
      最近更新 更多