【问题标题】:WCF REST Question, Binding, ConfigurationWCF REST 问题、绑定、配置
【发布时间】:2011-02-21 04:42:21
【问题描述】:

我正在使用 json 开发 WCF 休息接口。我已将该服务包装在 Windows 服务中以托管该服务,但我现在无法让该服务可调用。我不确定到底出了什么问题。

基本想法是我想在远程服务器上托管服务,因此我希望服务映射到端口 localhost:7600,以便可以通过将数据发布到 [server_ip]:7600 来调用它。问题很可能出在配置文件中,因为我是 WCF 和 Rest 的新手,我不太确定要为配置键入什么内容,如果一团糟,很抱歉。

我删除了几块代码和 cmets,使其更易于阅读。这些函数应该与服务无关,因为它们只调用 C# 函数。

编辑:我查看了建议的帖子,并重写了代码,但不幸的是,它仍然无法正常工作。 Mabye 我只是使用了错误的地址,你会用http://localhost:7600 调用它,对吧?

编辑:感谢大家的帮助。问题是您不能将 ServiceHost 与使用 UriTemplate 的属性一起使用。因此,如果我删除它,该服务至少可以正常工作。我仍然被困在一个部分。该服务需要可以通过 HTTP 请求调用,就像您可以使用 Fiddler 生成的一样。关于我将如何做到这一点的任何想法?

编辑: NVM,这是一个愚蠢的问题。将数据发布到 http://localhost:7600/PCMiler_Connect_Imple 并返回 json 数据。再次感谢大家。

编辑:所以这对遇到同样问题的其他人会更有帮助,我已经添加了现在的代码,并带有一个 json 调用示例。

WCF 服务接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data;

namespace PCMiler_Service
{
    [ServiceContract]
    public interface IPCMiler_Connect
    {
        [WebInvoke(Method = "POST",
                   ResponseFormat = WebMessageFormat.Json,
                   RequestFormat = WebMessageFormat.Json), //code corrected
        OperationContract]
        List<string> PCMiler_Connect_Imple(ZIP_List_Container container);
    }
}

WCF 服务实现

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

namespace PCMiler_Service
{
    [DataContract]
    public class ZIP_List_Container
    {
        [DataMember]
        public string[] ZIP_List { get; set; }
        [DataMember]
        public string Optimized { get; set; }
        [DataMember]
        public string Calc_Type { get; set; }
        [DataMember]
        public string Cross_International_Borders { get; set; }
        [DataMember]
        public string Use_Kilometers { get; set; }
        [DataMember]
        public string Hazard_Level { get; set; }
        [DataMember]
        public string OK_To_Change_Destination { get; set; }
    }

    public class PCMiler_Connect : IPCMiler_Connect
    {
        public List<string> PCMiler_Connect_Imple(ZIP_List_Container container)
        {
            return container.ZIP_List.ToList<string>();
        }
    }
}

XML 配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="PCMiler_Service.PCMiler_ConnectBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="jsonBehavior"  >
              <enableWebScript />
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="PCMiler_Service.PCMiler_ConnectBehavior"
                name="PCMiler_Service.PCMiler_Connect">
              <endpoint address="" behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
                  contract="PCMiler_Service.IPCMiler_Connect" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:7600/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>

服务包装器

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.ServiceModel;
using System.Text;
using System.Threading;

namespace PCMiler_Service
{
    public partial class PCMiler_Service : ServiceBase
    {
        ServiceHost host;
        Thread thread;

        public PCMiler_Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            host = new ServiceHost(typeof(PCMiler_Connect));
            host.Open();
        }

        protected override void OnStop()
        {
            if (host != null)
            {
                host.Close();
                host = null;
            }
        }
    }
}

带有 HTTP 的 JSON POST 示例

POST /PCMiler_Connect_Imple HTTP/1.1
HOST: localhost:7600
Content-Type: application/json
Content-Length: 84

{
     "container": {
                    "ZIP_List":["29340","29614"]
      }
}

【问题讨论】:

  • Ethan,请把“C#”保留在标签中,不要放在标题中。
  • 它可以在您的本地机器上运行吗?这是一条建议。在您的解决方案中创建一个新的控制台项目,并从那里测试您的服务。部署时,您可以将其作为 Windows 服务运行,但从 Visual Studio 运行和测试 Windows 服务确实很痛苦。
  • 另外,除非你已经完成了整个 HTTPCfg.exe,否则你需要在 Vista 或 Windows 7 上以管理员身份运行 Visual Studio。
  • 不,这在我用于开发的本地机器上不起作用。该项目在 Visual Studio 调试器中运行良好。当我安装该服务并尝试从它失败的浏览器调用它时。

标签: xml wcf configuration rest


【解决方案1】:

可能是一个愚蠢的问题,但是... 你的界面在哪里?

如果你读到这...

http://weblogs.asp.net/ralfw/archive/2007/04/14/a-truely-simple-example-to-get-started-with-wcf.aspx

...它(与 WCF 上的所有其他文章一样)暗示为了公开服务肯定需要接口声明,因为它还定义了客户端使用服务时使用的数据契约。

然而,这看起来不像您的典型 WCF 服务,更像是一个普通的老式 Windows 服务,它不是 WCF 服务(正如您应该从该链接中看到的那样),但是您似乎已经尝试使用一些 WCF组成部分(如合同属性)。

我认为您的问题是您缺少接口声明,我认为 WCF 需要这个。

【讨论】:

  • 其实没问题。您可以使用“ServiceContract”属性装饰一个类,该类成为接口和实现。如果您在 VS2010 中使用 VS 项目模板,它实际上是通过这种方式创建的。我同意这令人困惑,但这就是你的 WCF。
【解决方案2】:

我认为您需要使用 WebServiceHost 而不是 ServiceHost。

【讨论】:

  • @bulletshot60 我很困惑。您是说我的建议有帮助,还是说您能够在不使用 WCF REST 服务主机(即 System.ServiceModel.Web.WebServiceHost)的情况下公开 WCF REST 端点?
  • 我可以通过使用 System.ServiceModel.ServiceHost 在不使用 System.ServiceModel.Web.WebServiceHost 的情况下公开端点。
  • 这很好奇。请注意,除非您使用 WebServiceHost,否则某些事情似乎不起作用。看到这个问题stackoverflow.com/questions/2903652/…
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多