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

Azure WCF RESTful 服务( 使用 HTTP GET 和 POST 方法, Postman 测试)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2015年4月20日

CPOL

3分钟阅读

viewsIcon

12672

downloadIcon

151

这是一个示例文章, 介绍了如何为 Azure 的 GET 和 POST 方法实现 RESTful 服务

引言

在这里,我将向您展示我为了理解如何将公开 RESTful WCF 契约的 Azure Web 服务用于 GET 和 POST 方法而完成的 POC 项目。

完成的步骤

1.  运行 Visual Studio 并创建一个新的 Azure 云服务:

我将我的服务称为 AzureRestullServiceSample

2.  添加一个 WCFServiceWebRole:

3. 我将接口文件和服务实现分别重命名为 ISampleService.cs 和 SampleService.svc

4.  让我们考虑我们的接口用于用户管理系统。我们计划在此处使用 HTTP 方法添加和读取用户。为此,我们需要定义类 UserData:

    [DataContract]
    public class UserData
    {
        private long   m_UserID;       //ID of the user
        private string m_UserName;     //name of the user
        private string m_UserPassword; //user's password
        private string m_UserCell;     //user's cell phone number
        private string m_UserMail;     //user's mail

        /// <summary>
        /// ID of the user
        /// </summary>
        [DataMember]
        public long UserID
        {
            get { return m_UserID; }
            set { m_UserID = value; }
        }
        /// <summary>
        /// name of the user
        /// </summary>
        [DataMember]
        public string UserName
        {
            get { return m_UserName; }
            set { m_UserName = value; }
        }
        /// <summary>
        /// user's password
        /// </summary>
        [DataMember]
        public string UserPassword
        {
            get { return m_UserPassword; }
            set { m_UserPassword = value; }
        }
        /// <summary>
        /// user's cell phone number
        /// </summary>
        [DataMember]
        public string UserCell
        {
            get { return m_UserCell; }
            set { m_UserCell = value; }
        }
        /// <summary>
        /// user's mail
        /// </summary>
        [DataMember]
        public string UserMail
        {
            get { return m_UserMail; }
            set { m_UserMail = value; }
        }
    }

5. 现在我们将定义方法来读取用户并将新用户添加到系统中

    [ServiceContract]
    public interface ISampleService
    {
        [OperationContract]
        [WebInvoke( UriTemplate = "getusers",
                    Method = "GET",
                    RequestFormat = WebMessageFormat.Json,
                    ResponseFormat = WebMessageFormat.Json,
                    BodyStyle = WebMessageBodyStyle.Wrapped)]
        bool GetAllUsers(out List<UserData> users);

        [OperationContract]
        [WebInvoke(UriTemplate = "adduser",
                    Method = "POST",
                    RequestFormat = WebMessageFormat.Json,
                    ResponseFormat = WebMessageFormat.Json,
                    BodyStyle = WebMessageBodyStyle.Wrapped)]
        bool AddUser(List<UserData> users);
    }

在这里我想稍微解释一下。我们在这里使用了一组需要解释的属性

  1. OperationContract 属性使定义的方法可以在服务契约中公开。如果您不使用此属性,则无法从外部访问该方法。 https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute(v=vs.110).aspx
  2. WebInvoke 属性指示 WCF REST 编程模型可以调用该操作 https://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute(v=vs.110).aspx 我们使用 Method="GET" 来指示 GET HTTP 方法,并使用 "POST" 来标识 POST 调用。我们还使用 Json 作为 HTTP 方法的请求和响应格式

​6. 让我们实现 GET 和 POST 方法:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] //without this attribute service doesn't work this is service added manually to project
    public class SampleService : ISampleService
    {
        public bool GetAllUsers(out List<UserData> users)
        {
            
            users = new List<UserData>();
            for (int i = 0; i < 3; i++) 
            {
                UserData user = new UserData();
                user.UserID = i;
                user.UserCell = "1111" + i.ToString();
                user.UserMail = "TestMail" + i.ToString();
                user.UserName = "UserName" + i.ToString();
                user.UserPassword = "UserPassword" + i.ToString();
                users.Add(user);
            }
            return true;
        }

        public bool AddUser(List<UserData> users)
        {
            return true;
        }
    }

7. 现在我们可以运行我们的服务并测试这两种方法。但在那之前,您需要确保几件事:

  1. 在文件 SampleService.svc 中打开标记,并确保 Service 属性指向您的类,在我的例子中是:Service="WCFServiceWebRole.SampleService"
  2. 在 WebConfig 文件中,您必须拥有带有绑定 "webHttpBinding" 的服务。我 webconfig 文件中最关键的部分如下(您可以在附加的项目源中打开 WebConfig 文件的完整版本)
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServiceBahavior" name="WCFServiceWebRole.SampleService">
        <endpoint behaviorConfiguration="MyServiceBehavior" binding="webHttpBinding"
          bindingConfiguration="MyBindingConfiguration" name="serviceConfiguration"
          contract="WCFServiceWebRole.ISampleService" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="MyServiceBehavior">
          <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Xml" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBahavior">
          <!-- To avoid disclosing metadata information, set the value below to false 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>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="MyBindingConfiguration" allowCookies="true" sendTimeout="00:01:00" bypassProxyOnLocal="false"
         hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647"
         maxBufferPoolSize="52428800" maxReceivedMessageSize="2147483647" transferMode="Buffered" useDefaultWebProxy="true">
          <security mode="None" />
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
            maxBytesPerRead="20000" maxNameTableCharCount="16384" ></readerQuotas>
          <!--security mode="Transport" /-->
        </binding>
      </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

8. 让我们测试 GET 方法。我在 GoogleChrom 中运行服务并请求添加用户 URL。结果我收到了所有我生成的用户的详细信息

这里完美的事情是您不必关心将您的输出数据结构序列化为 JSON。WCF 为您做到了这一点,您所需要做的就是享受通过 HTTP 使用您的 API。我不确定具有二进制数据的非常复杂的类型,可能您需要添加一些序列化,但具有基本数据类型的常用类可以完美地序列化。

9. 现在让我们测试 POST 方法。为此,我向我的 Chrome 浏览器添加了 Postman 工具。此工具使您能够向服务发送 POST 请求。我使用了以下链接来熟悉如何从 Postman 使用 GET 和 POST 调用:http://docs.brightcove.com/en/video-cloud/player-management/guides/postman.html

下面是我的屏幕,其中包含我输入到 Postman 中的数据以执行 POST 请求,以及从 3 个用户的列表中列出的路径,其中最后一个用户没有所有字段(我这样做是为了调试目的并检查 WCF 是否会正确映射一切)。我花了一个小时来构建正确的 JSON,我的错误是我没有使用参数名称:"users"。如果我不使用它,HTTP POST 调用不会解析输入 JSON,并且我的函数输入参数等于 null。

让我们运行请求并看看我们收到了什么

我特意向您展示第一个元素,其中我填写了所有数据,以及最后一个元素,其中我们没有传递一些参数,它们等于 null。


 

就这样,现在您可以使用任意数量的 GET 和 POST 方法扩展此服务,并享受您在 WCF 和 Azure 中的体验。示例项目的源代码附在此文章中,您可以下载并在您的系统上运行它们。

© . All rights reserved.