将WCF服务转换为RESTful应用程序?

嘿,我没有把wcf变成一个宁静的服务。 所以我想知道是否有人可以在这里启动WCF服务应用程序时采用基本代码:

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WcfService1 { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Add your service operations here } // Use a data contract as illustrated in the sample below to add composite types to service operations. [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } } 

和服务:

 namespace WcfService1 { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together. public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } } } 

我所做的就是启动这个WCF服务应用程序并打开另一个VS2010灵魂,其基本forms有一个文本框按钮和标签,并在另一个解决方案中复制了serviceapp的服务位置,所以当我输入一个数字时,我得到了一个响应服务。

 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } public ServiceReference1.Service1Client testClient = new ServiceReference1.Service1Client(); private void button1_Click(object sender, EventArgs e) { label1.Text = testClient.GetData(Convert.ToInt32(textBox1.Text)); } } } 

真的很快又脏,但服务于它的目的。

现在,如果任何人可以帮助代码,你如何把它变成一个宁静的服务?

我的配置文件的结尾部分:

                           

用Justins配置代码编辑更新:

因此,当我触摸配置文件时,我通常的错误是:无法添加服务。 可能无法访问服务元数据。 确保您的服务正在运行并公开元数据

 Error: Cannot obtain Metadata from http://localhost:26535/Service1.svc If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:26535/Service1.svc Metadata contains a reference that cannot be resolved: 'http://localhost:26535/Service1.svc'. The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.HTTP GET Error URI: http://localhost:26535/Service1.svc There was an error downloading 'http://localhost:26535/Service1.svc'. The request failed with the error message:--  Operation 'GetData' in contract 'IService1' has a path variable named 'value' which does not have type 'string'. ÿVariables for UriTemplate path segments must have type 'string'.  body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }    

Server Error in '/' Application.

Operation 'GetData' in contract 'IService1' has a path variable named 'value' which does not have type 'string'. ÿVariables for UriTemplate path segments must have type 'string'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: Operation 'GetData' in contract 'IService1' has a path variable named 'value' which does not have type 'string'. ÿVariables for UriTemplate path segments must have type 'string'.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[InvalidOperationException: Operation 'GetData' in contract 'IService1' has a path variable named 'value' which does not have type 'string'. Variables for UriTemplate path segments must have type 'string'.] System.ServiceModel.Dispatcher.UriTemplateClientFormatter.Populate(Dictionary`2& pathMapping, Dictionary`2& queryMapping, Int32& totalNumUTVars, UriTemplate& uriTemplate, OperationDescription operationDescription, QueryStringConverter qsc, String contractName) +726 System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter..ctor(OperationDescription operationDescription, IDispatchMessageFormatter inner, QueryStringConverter qsc, String contractName, Uri baseAddress) +94 System.ServiceModel.Description.WebHttpBehavior.GetRequestDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint) +137 System.ServiceModel.Description.WebHttpBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) +659 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +3864 System.ServiceModel.ServiceHostBase.InitializeRuntime() +37 System.ServiceModel.ServiceHostBase.OnBeginOpen() +27 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +49 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261 System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +121 System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479[ServiceActivationException: The service '/Service1.svc' cannot be activated due to an exception during compilation. The exception message is: Operation 'GetData' in contract 'IService1' has a path variable named 'value' which does not have type 'string'. Variables for UriTemplate path segments must have type 'string'..] System.ServiceModel.AsyncResult.End(IAsyncResult result) +11655726 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176 System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +275 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Version Information:ÿMicrosoft .NET Framework Version:2.0.50727.5448; ASP.NET Version:2.0.50727.5456
--.

正如您所提到的,这是一个新项目,因此重定向可能有助于使该过程更简单一些?

这是一篇关于你要问的MSDN文章 。

但是,我特别建议查看ServiceStack以创建RESTful服务,因为它使该过程非常容易。 WCF肯定不提供实现此目的的简单方法。 在这种情况下,它们使IMO过于复杂。

如果这确实是一个项目的开始,那就是我要去的地方

更直接的答案来自本文,它有点旧,但可能有助于理解REST,以及如何在WCF中实现它 。 并且是在Web [Type]属性中指定您的GET / POST / PUT / DELETE

 [WebGet(UriTemplate = @"Data?value={value}")] [OperationContract] string GetData(int value); 

此外,您需要在应用程序的.config中执行此操作(同样适用于Skonnard的旧版MSDN文章 )

                 

哪个会转换为您的配置:

                             

然后,您可能需要向端点添加地址属性,以便它知道要查找的位置。

配置简单的WCF REST服务时,过去我遇到的错误类似于您的错误。 在贾斯汀提到的文章中:
使用WCF 3.5设计和构建RESTful Web服务的指南
(搜索 – 定义HTTP接口:[WebGet]

您会注意到Get方法都采用字符串。

当您尝试将其中一个示例WCF项目转换为RESTful项目时,您遇到的错误很常见。 要修复,只需更改方法和接口的签名以接受字符串 ,而不是int ,这就是内部exception所抱怨的:

合同’IService1’中的’GetData’操作有一个名为’value’的路径变量,它没有’string’类型。 UriTemplate路径段的变量必须具有“string”类型

原版的:

 public string GetData(int value) 

改性:

 public string GetData(string value) 

这是我所拥有的示例项目的一个简单的.config部分,我知道它可以工作:

               

对希望作为RESTful服务提供的操作使用WebGet属性。

使用webHttpBinding。

请记住在配置中添加您的行为。

应该足以让它开始。

编辑:

在您的服务中添加新绑定:

  

等 – 然后进一步添加

  

作为端点行为。

[WebGet]属性 – 查看各种选项以进一步开发它。

这是codeproject.com的示例项目。 需要做

 [WebGet(UriTemplate = "?id={id}")] 

代替

 [WebGet(UriTemplate = "{id}")]