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





5.00/5 (1投票)
这是一个示例文章,
引言
在这里,我将向您展示我为了理解如何将公开 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);
}
在这里我想稍微解释一下。我们在这里使用了一组需要解释的属性
- OperationContract 属性使定义的方法可以在服务契约中公开。如果您不使用此属性,则无法从外部访问该方法。 https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute(v=vs.110).aspx
- 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. 现在我们可以运行我们的服务并测试这两种方法。但在那之前,您需要确保几件事:
- 在文件 SampleService.svc 中打开标记,并确保 Service 属性指向您的类,在我的例子中是:Service="WCFServiceWebRole.SampleService"
- 在 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 中的体验。示例项目的源代码附在此文章中,您可以下载并在您的系统上运行它们。