通过Console / WinForms中的ServiceHost托管WCF服务

时间:2013-10-18 05:43:44

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

我在控制台应用程序(.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我得到: enter image description here 如何启用元数据发布? 请参阅Dai Bok的回答。

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

3 个答案:

答案 0 :(得分:2)

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

您需要为http获取启用元数据,在中检查您的Web配置 system.serviceModel - &gt;行为 - &gt; serviceBehaviors - &gt;行为 - &gt; 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;
    }

答案 1 :(得分:0)

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

对于第2部分:为了将数据提供给客户端,您使用HttpWebRequest并从客户端调用服务。

答案 2 :(得分:0)

  

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

这取决于您希望获取此数据的位置。从客户端上呈现的网页,您可以使用一些jQuery Ajax函数。

如果您想从服务器端使用此功能,可以使用HttpWebRequest等。