c# - 使用 wcf Restful 服务通过 WebRequest 的原始正文发送和接收数据?

标签 c# asp.net web-services wcf rest

我已经实现了一个 WCF RESTful Web 服务,它在 http POST 期间通过原始主体获取参数。当通过 "POSTMAN" chrome 扩展进行测试时,它会给出如下所示的所需结果图片:

REST service url and raw body parameters

现在我想使用下面的代码通过 ASP Web 应用程序使用相同的服务时获得相同的结果

JavaScriptSerializer ser = new JavaScriptSerializer();
var request = (HttpWebRequest)WebRequest.Create("http://192.168.0.19/SSARESTservice/SSA/IMEIVerification");
request.Method = "POST";
request.ContentType = "application/json";
DeviceData data = new DeviceData() { IMEI = "352423061590616" };
string str = ser.Serialize(data);
byte[] databyte = System.Text.Encoding.UTF8.GetBytes(str);
request.ContentLength = databyte.Length;
var reqStrm = request.GetRequestStream();
reqStrm.Write(databyte, 0, databyte.Length);

var response = (HttpWebResponse)request.GetResponse();
var respStrm = response.GetResponseStream();
StreamReader reader = new StreamReader(respStrm);
string bodyprm = reader.ReadToEnd();

但是执行上述代码时出现以下错误

The remote server returned an error: (400) Bad Request.

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.Net.WebException: The remote server returned an error: (400) Bad Request.

第 34 行:var response = (HttpWebResponse)request.GetResponse();

这是我的运营契约(Contract)

[WebInvoke(UriTemplate = "IMEIVerification", Method = "POST",  ResponseFormat= WebMessageFormat.Json, RequestFormat =       WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.WrappedRequest)
[OperationContract]
JsonResponseProps VerifyDevice(DeviceData data);

以及实现

public JsonResponseProps VerifyDevice(DeviceData data)
{
JsonResponseProps jis = new JsonResponseProps();
using (con = new SqlConnection(connection))
{
con.Open();
cmd = new SqlCommand("select IMEI from dbo.tbl_master_Devicedata where IMEI='" + data.IMEI + "'", con);
var IMEI = cmd.ExecuteScalar();
if (IMEI != null)
{
jis.msg = "Verification Successful";
jis.success = "true";
}
else
{
jis.msg = "Verification Failed";
jis.success = "false";
}
con.Close();
}
return jis;
}

谢谢

最佳答案

问题是使用 POSTMAN 发送:

{"data":{"IMEI":"352423061590616"}}

但是当您检查

中的序列化数据时
JavaScriptSerializer ser = new JavaScriptSerializer();

DeviceData data = new DeviceData() { IMEI = "352423061590616" };

string str = ser.Serialize(data);

您将看到接线格式为:

{"IMEI":"352423061590616"}

这并不能很好地映射您的 data 参数。

要解决此问题,请添加一个额外的类以用于根容器。它有一个 DeviceData 类型的数据属性来保存您的实际负载。序列化的代码如下所示:

// container with a data property
// this one is being serialized
public class Root
{
    public DeviceData data { get; set; }
}

public class DeviceData
{
    public string IMEI { get; set; }
}

protected void CallIMEIVerfication()
{
    JavaScriptSerializer ser = new JavaScriptSerializer();
    DeviceData data = new DeviceData() { IMEI = "352423061590616" };
    var root = new Root { data=data };
    string str = ser.Serialize(root);
    // rest of your code
}

关于c# - 使用 wcf Restful 服务通过 WebRequest 的原始正文发送和接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34290322/

相关文章:

asp.net - 绘制 HTML 表格边框

c# - 当多个用户在 Gridview 中选择同一行时,Java 脚本弹出框

web-services - 录制时 WireMock 会播放吗?

web-services - Flex 无法识别 crossdomain.xml 策略文件

c# - 导出到 excel 抛出 System.OutOfMemoryException

C# 将 FontDialog 设置为仅显示 TrueType 字体

c# - 新的 ScriptBundle .Include 不适用于 Breeze.min.js

c# - 具有可空 double 的 Web 服务响应未正确反序列化

c# - 放置图像 Gridview 删除按钮

java - 从 Java 发送到 WebService 时,Zip 文件损坏