65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (21投票s)

2011年10月30日

CPOL

3分钟阅读

viewsIcon

268513

如何创建基于 WCF REST 的服务。

引言

在本文中,我们将了解如何创建基于 WCF REST 的服务。 在此示例中,我们将定义两个方法,GetSampleMethod(方法类型为 GET)和 PostSampleMethod(方法类型为 POST)。

  • GET 方法将输入作为 String,并返回格式化的 String
  • POST 方法将输入作为 XML(用户注册),并返回状态 string

注意: 应该具备关于什么是 WCF,为什么使用 WCF 的基本知识,并且我的文章将讨论如何将 WCF 与 webHttpBinding 结合使用。

我们将把本文分为以下几个部分

  1. 定义 WCF 服务
    1. 定义接口
    2. 定义类
    3. 实现 POSTGET 方法
  2. 定义 WCF 服务的配置
    1. 服务配置
    2. 行为配置
  3. 冒烟测试 WCF 服务(在客户端使用之前)
  4. 实现客户端代码以使用 WCF 服务

定义 WCF 服务

  1. 打开 VS 2010 并选择新项目,然后选择 WCF 并选择 WCF 服务应用程序,并将其命名为 WCF Rest Based。
  2. 现在将新的 Service 类添加到此应用程序中,命名为 “MyService.svc
  3. 打开接口 *IMservice.cs* 并添加以下代码
    1. OperationContract: PostSampleMethod
    2. WebInvoke 方法类型 = POST,因为我们正在实现 POST
    3. URI 模板定义了标识/链接此方法的 URL 格式。
      注意: 方法名称、URI 模板名称和操作约定名称可能不同,意味着它们可以不同
    4. PostSampleMethod 将接受 XML string 作为 POST 方法的输入。 使用 Stream 作为输入参数,我们可以在使用它之前反序列化输入数据。
      [OperationContract(Name = “PostSampleMethod”)]
              [WebInvoke(Method = “POST”,
               UriTemplate = “PostSampleMethod/New”)]
              string PostSampleMethod(Stream data);
    5. OperationContract 名称:GetSampleMethod
    6. WebGet 属性定义方法类型为 GET
    7. 需要包含以下命名空间
    8. System.ServiceModel.Web;
      System.ServiceModel
      System.Runtime.Serialization
      System.IO
          [OperationContract(Name = “GetSampleMethod”)]
              [WebGet(UriTemplate = “GetSampleMethod/inputStr/{name}”)]
              string GetSampleMethod(string name);
  4. 打开 *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();
        }

定义 WCF 服务的配置

  1. 打开 *web.config*,因为我们需要为我们的 WCF 服务定义配置。 如果您希望我们的服务作为 webHttp 的一部分被访问,那么我们需要定义 webHttpBindingmexHttpBinding
  2. 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 的端点

    这些值应与上面显示的值相同。

  3. 现在在 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 服务

  1. 在 IIS 中配置 WCF 服务
  2. 为了检查我们的 WCF 服务是否正常工作,让我们通过在浏览器中打开 *MyService.svc* 来测试它,在我的例子中它是 https:///wcfrestbased/MyService.svc 
  3. 要测试我们的 GET 方法服务,您可以通过 https:///wcfrestbased/MyService.svc/GetSampleMethod/inputStr/suryaprakash 调用它,并显示数据为 “您输入的 userNamesuryaprakash”。
  4. 通过这个,我们可以确认我们的服务工作正常。

实现客户端代码以使用 WCF 服务

  1. 创建新的网站应用程序,它将充当访问 WCF 服务的客户端。
  2. 向 *default.aspx* 页面添加一个 textbox 并将其命名为 txtResult 并打开 *Default.aspx.cs*
  3. 定义以下函数,该函数将调用 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(’>
  4. 现在让我们继续实现代码以从客户端应用程序调用 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;
            }
  5. 现在继续并调用上述方法以查看每个方法的输出。

编码愉快… 希望这有帮助!

历史

  • 2011 年 10 月 29 日:初始版本
© . All rights reserved.