【问题标题】:Hosting WCF service via ServiceHost in Console/WinForms通过控制台/WinForms 中的 ServiceHost 托管 WCF 服务
【发布时间】:2013-10-18 05:43:44
【问题描述】:

我在控制台应用程序 (.NET 4.0) 中托管 WCF 服务。服务代码(来自msdn 示例):

using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace WCFServiceHost
{
    [ServiceContract(Namespace = "WCFServiceHost")]
    public interface ICalculator
    {
        [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
        MathResult DoMathJson(double n1, double n2);

        [WebInvoke(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped)]
        MathResult DoMathXml(double n1, double n2);

    }

    public class CalculatorService : ICalculator
    {

        public MathResult DoMathJson(double n1, double n2)
        {
            return DoMath(n1, n2);
        }

        public MathResult DoMathXml(double n1, double n2)
        {
            return DoMath(n1, n2);
        }

        private MathResult DoMath(double n1, double n2)
        {
            MathResult mr = new MathResult();
            mr.sum = n1 + n2;
            mr.difference = n1 - n2;
            mr.product = n1 * n2;
            mr.quotient = n1 / n2;
            return mr;
        }
    }

    [DataContract]
    public class MathResult
    {
        [DataMember]
        public double sum;

        [DataMember]
        public double difference;

        [DataMember]
        public double product;

        [DataMember]
        public double quotient;
    }
}

接下来是控制台应用代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace WCFServiceHost
{
    class Program
    {
        public static void Main()
        {
            var adrs = new Uri[1];
            adrs[0] = new Uri("http://localhost:3980");
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), adrs))
            {
                try
                {
                    // Open the ServiceHost to start listening for messages.
                    serviceHost.Open();

                    // The service can now be accessed.
                    Console.WriteLine("The service is ready.");
                    Console.WriteLine("Press <ENTER> to terminate service.");
                    Console.ReadLine();

                    // Close the ServiceHost.
                    serviceHost.Close();
                }
                catch (TimeoutException timeProblem)
                {
                    Console.WriteLine(timeProblem.Message);
                    Console.ReadLine();
                }
                catch (CommunicationException commProblem)
                {
                    Console.WriteLine(commProblem.Message);
                    Console.ReadLine();
                }
            }
        }
    }
}

还有我的两个问题:

1. 当我打开 _http://localhost:3980 时,我得到: 如何启用元数据发布? 请参阅 Dai Bok 的回答。

  1. 现在如何从该服务获取数据 - (从msdn 示例中的服务获取数据)?嵌入任何网络框架(如Nancy)或使用HttpListener?

【问题讨论】:

    标签: c# winforms wcf wcf-binding wcf-hosting


    【解决方案1】:

    您需要确保您的 WCF Web 配置设置正确

    您需要为 http 获取启用元数据,检查您的网络配置 system.serviceModel -> 行为 -> serviceBehaviors -> 行为 -> serviceMetadata

    并确保您拥有:

    <serviceMetadata httpGetEnabled="true"/>
    

    对于第 2 部分,您可以获得数据,您可以执行类似的操作

       public MathResult GetResult(int a, int b) {
            var status = new MathResult();
            try {
                        var myBinding = new WSHttpBinding();
                        var myEndpoint =
                            new EndpointAddress(
                                new Uri("http://localhost:3980/"));
                        var myChannelFactory = new ChannelFactory<ICalculator>(myBinding, myEndpoint);
                        ICalculator client = myChannelFactory.CreateChannel();
                status = client.DoMathJson(a,b);
            } catch (Exception e) {
                //do something proper here 
            }
            return status;
        }
    

    【讨论】:

    • 谢谢!我的第一个问题已经结束。在第二个问题中,我的意思是用户加载 html 页面并使用 msdn.microsoft.com/en-us/library/bb472488.aspx 这样的服务。
    • 你的意思是你正在使用nancy? about 的示例可以放在库中并按上述方式使用。到目前为止,您尝试过做什么。你有一些示例代码吗?
    • 目前我没有使用 Nancy 或其他框架,我想知道是否可以不使用任何库作为主机 html 对 WCF 服务的 XHR 请求?
    • 在客户端我使用html和纯javascript,没有任何JS框架)))
    • 我明白了,你很可能会遇到跨域调用的问题,它被称为相同的源策略。不知道你是否知道这件事?基本上localhost/calc.html 上的html 页面不能通过javascript 与localhost:3980 交谈。你可以让它工作,但你需要做更多的工作才能进行跨域调用 - stackoverflow.com/questions/3076414/…。你都尝试了些什么?可以出示一下代码吗?
    【解决方案2】:

    您的第一个问题已解决: 但是如果你们两个在一起会更好。 它用于元数据生成:

    对于第 2 部分:为了向客户端获取数据,您使用 HttpWebRequest 并从客户端调用服务。

    【讨论】:

      【解决方案3】:

      现在如何从该服务获取数据

      这取决于您想从哪里获取这些数据。从客户端呈现的网页中,您可以使用一些jQuery Ajax 函数。

      如果你想从服务器端使用它,你可以使用HttpWebRequest 或类似的。

      【讨论】:

      • 即我可以使用 XHR 从任何 html 页面(例如,从本地磁盘打开)调用我的 WCF 服务方法并获取类似msdn.microsoft.com/en-us/library/bb472488.aspx? 中的数据。谢谢
      • 不,我不知道从哪一边开始:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多