开发 WCF RESTful 服务,支持 GET 和 POST 方法






4.75/5 (21投票s)
如何创建基于 WCF REST 的服务。
引言
在本文中,我们将了解如何创建基于 WCF REST 的服务。 在此示例中,我们将定义两个方法,GetSampleMethod
(方法类型为 GET
)和 PostSampleMethod
(方法类型为 POST
)。
GET
方法将输入作为String
,并返回格式化的String
。POST
方法将输入作为 XML(用户注册),并返回状态string
。
注意: 应该具备关于什么是 WCF,为什么使用 WCF 的基本知识,并且我的文章将讨论如何将 WCF 与 webHttpBinding
结合使用。
我们将把本文分为以下几个部分
- 定义 WCF 服务
- 定义接口
- 定义类
- 实现
POST
和GET
方法 - 定义 WCF 服务的配置
- 服务配置
- 行为配置
- 冒烟测试 WCF 服务(在客户端使用之前)
- 实现客户端代码以使用 WCF 服务
定义 WCF 服务
- 打开 VS 2010 并选择新项目,然后选择 WCF 并选择 WCF 服务应用程序,并将其命名为 WCF Rest Based。
- 现在将新的
Service
类添加到此应用程序中,命名为 “MyService.svc” - 打开接口 *IMservice.cs* 并添加以下代码
OperationContract
:PostSampleMethod
WebInvoke
方法类型 =POST
,因为我们正在实现POST
- URI 模板定义了标识/链接此方法的 URL 格式。
注意: 方法名称、URI 模板名称和操作约定名称可能不同,意味着它们可以不同 PostSampleMethod
将接受 XMLstring
作为POST
方法的输入。 使用Stream
作为输入参数,我们可以在使用它之前反序列化输入数据。[OperationContract(Name = “PostSampleMethod”)] [WebInvoke(Method = “POST”, UriTemplate = “PostSampleMethod/New”)] string PostSampleMethod(Stream data);
OperationContract
名称:GetSampleMethod
WebGet
属性定义方法类型为GET
- 需要包含以下命名空间
-
打开 *MyService.cs* 类并为
IMyService
接口中定义的方法提供实现,如下所示public string PostSampleMethod(Stream data) { // convert Stream Data to StreamReader StreamReader reader = new StreamReader(data); // Read StreamReader data as string string xmlString = reader.ReadToEnd(); string returnValue = xmlString; // return the XMLString data return returnValue; } public string GetSampleMethod(string strUserName) { StringBuilder strReturnValue = new StringBuilder(); // return username prefixed as shown below strReturnValue.Append(string.Format (”You have entered userName as {0}”, strUserName)); return strReturnValue.ToString(); }
System.ServiceModel.Web;
System.ServiceModel
System.Runtime.Serialization
System.IO
[OperationContract(Name = “GetSampleMethod”)]
[WebGet(UriTemplate = “GetSampleMethod/inputStr/{name}”)]
string GetSampleMethod(string name);
定义 WCF 服务的配置
- 打开 *web.config*,因为我们需要为我们的 WCF 服务定义配置。 如果您希望我们的服务作为
webHttp
的一部分被访问,那么我们需要定义webHttpBinding
和mexHttpBinding
。 - 在
System.ServiceModel
中定义配置,如下所示。 要了解有关以下配置的详细信息,请查看 URL:https://ch1blogs.cognizant.com/blogs/279850/2011/10/18/service-end-point-not-found/。<services> <service name=”WcfRestBased.MyService” behaviorConfiguration=”myServiceBehavior” > <endpoint name=”webHttpBinding” address=”" binding=”webHttpBinding” contract=”WcfRestBased.IMyService” behaviorConfiguration=”webHttp” > </endpoint> <endpoint name=”mexHttpBinding” address=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange” /> </service> </services>
服务名称: 要查找要给出的内容,请右键单击服务并选择
ViewMarkup
选项。例如,在我的例子中,它是 *MyService.svc*,查找
Service
属性并使用完整的string
,在我的例子中它是Service=”WcfRestBased.MyService”
。behaviorConfiguration: 可以是任何名称,但当我们定义行为设置时,它将再次被使用,在我的例子中它是
myServiceBehavior
。webHttpBinding 的端点
- endpoint name: 如果您正在配置 Web 访问,则应为
webHttpBinding
- address: 我们可以将其留空
- binding: 应该是
webHttpBinding
- contract: 应该是
Namespace.Interfacename
。 在我的例子中,它是wcfRestBased.IMyService
- behaviorConfiguration: 应该是
webHttp
mexHttpBinding 的端点
这些值应与上面显示的值相同。
- endpoint name: 如果您正在配置 Web 访问,则应为
- 现在在
System.ServiceModel
中定义服务行为,如下所示。 “mySeriveBehavior
” 名称应与Service
标记(如上所示)中定义的behaviorConfiguration
名称匹配<behaviors> <serviceBehaviors> <behavior name=”myServiceBehavior” > <serviceMetadata httpGetEnabled=”true”/> <serviceDebug includeExceptionDetailInFaults=”false” /> </behavior> <behavior> <!– To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment –> <serviceMetadata httpGetEnabled=”true”/> <!– To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information –> <serviceDebug includeExceptionDetailInFaults=”false”/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name=”webHttp”> <webHttp/> </behavior> </endpointBehaviors> </behaviors>
冒烟测试 WCF 服务
- 在 IIS 中配置 WCF 服务
- 为了检查我们的 WCF 服务是否正常工作,让我们通过在浏览器中打开 *MyService.svc* 来测试它,在我的例子中它是 https:///wcfrestbased/MyService.svc
- 要测试我们的
GET
方法服务,您可以通过 https:///wcfrestbased/MyService.svc/GetSampleMethod/inputStr/suryaprakash 调用它,并显示数据为 “您输入的 ”。userName
为suryaprakash
- 通过这个,我们可以确认我们的服务工作正常。
实现客户端代码以使用 WCF 服务
- 创建新的网站应用程序,它将充当访问 WCF 服务的客户端。
- 向 *default.aspx* 页面添加一个
textbox
并将其命名为txtResult
并打开 *Default.aspx.cs* - 定义以下函数,该函数将调用 rest 服务来获取数据。 此方法将调用服务(
MyService
)中实现的POSTSAMPLEMETHOD
。 添加了内联代码注释。void CallPostMethod() { // Restful service URL string url = “http://localhost/wcfrestbased/myservice.svc/PostSampleMethod/New“; // declare ascii encoding ASCIIEncoding encoding = new ASCIIEncoding(); string strResult = string.Empty; // sample xml sent to Service & this data is sent in POST string SampleXml = @”<parent>” + “<child>” + “<username>username</username>” + “<password>password</password>” + “</child>” + “</parent>”; string postData = SampleXml.ToString(); // convert xmlstring to byte using ascii encoding byte[] data = encoding.GetBytes(postData); // declare httpwebrequet wrt url defined above HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url); // set method as post webrequest.Method = “POST”; // set content type webrequest.ContentType = “application/x-www-form-urlencoded”; // set content length webrequest.ContentLength = data.Length; // get stream data out of webrequest object Stream newStream = webrequest.GetRequestStream(); newStream.Write(data, 0, data.Length); newStream.Close(); // declare & read response from service HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse(); // set utf8 encoding Encoding enc = System.Text.Encoding.GetEncoding(”utf-8?); // read response stream from response object StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(), enc); // read string from stream data strResult = loResponseStream.ReadToEnd(); // close the stream object loResponseStream.Close(); // close the response object webresponse.Close(); // below steps remove unwanted data from response string strResult = strResult.Replace(”</string>”, “”); strResult = strResult.Substring(strResult.LastIndexOf(’>
- 现在让我们继续实现代码以从客户端应用程序调用
GETSAMPLEMETHOD
。 以下代码有内联注释void CallGetMethod() { // Restful service URL string url = “http://localhost/wcfrestbased/myservice.svc/ GetSampleMethod/inputStr/suryaprakash“; string strResult = string.Empty; // declare httpwebrequet wrt url defined above HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url); // set method as post webrequest.Method = “GET”; // set content type webrequest.ContentType = “application/x-www-form-urlencoded”; // declare & read response from service HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse(); // set utf8 encoding Encoding enc = System.Text.Encoding.GetEncoding(”utf-8?); // read response stream from response object StreamReader loResponseStream = new StreamReader (webresponse.GetResponseStream(), enc); // read string from stream data strResult = loResponseStream.ReadToEnd(); // close the stream object loResponseStream.Close(); // close the response object webresponse.Close(); // assign the final result to text box txtResult.Text = strResult; }
- 现在继续并调用上述方法以查看每个方法的输出。
编码愉快… 希望这有帮助!
历史
- 2011 年 10 月 29 日:初始版本