我正在使用json处理WCF休息接口。我已将服务包装在Windows服务中以托管服务,但我现在无法使服务可以调用。我不确定到底出了什么问题。
基本思想是我想在远程服务器上托管服务,所以我希望服务映射到端口localhost:7600,以便可以通过将数据发布到[server_ip]:7600来调用它。这个问题最有可能出现在配置文件中,因为我是WCF的新手而且我不太确定要为配置输入什么,所以很抱歉,如果这是一团糟。
我删除了几个代码和注释块,使其更容易阅读。这些功能应该与服务无关,因为它们只调用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"]
}
}
答案 0 :(得分:0)
可能是一个愚蠢的问题,但...... 你的界面在哪里?
如果你读到这个......
http://weblogs.asp.net/ralfw/archive/2007/04/14/a-truely-simple-example-to-get-started-with-wcf.aspx
...它(就像WCF上的其他所有文章一样)意味着为了公开服务肯定需要一个接口声明,因为它还定义了客户端使用服务时使用的datacontract。
然而,这看起来不像典型的WCF服务,更像是一个不是WCF服务的普通老式Windows服务(正如您应该从该链接中看到的那样),但是看起来您已经想要使用一些WCF组件(如合同属性)。
我认为你的问题是你缺少的接口声明,我认为WCF需要这个。
答案 1 :(得分:0)
我认为您需要使用WebServiceHost而不是ServiceHost。