【问题标题】:send and receive data through raw body of a WebRequest using wcf restful service?使用 wcf RESTful 服务通过 WebRequest 的原始正文发送和接收数据?
【发布时间】:2016-03-21 07:24:10
【问题描述】:

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

现在我想在使用以下代码通过 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();

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

远程服务器返回错误:(400) Bad Request。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Net.WebException:远程服务器返回错误:(400)错误请求。

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

这是我的运营合同

[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;
}

谢谢

【问题讨论】:

  • 能否分享一下restful服务中定义方法调用的代码?请在接口和方法定义中包含所有 WCF 属性。请编辑问题以清理代码块。
  • 添加跟踪监听器以便了解更多关于异常的信息!
  • @SOHO Developer 我已经使用 SO 快 3 年了,但从未发布过问题。很高兴看到 cmets。我将通过添加 wcf 服务代码来编辑我的问题

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


【解决方案1】:

问题是您使用 POSTMAN 发送:

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

但是当您检查来自

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

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

string str = ser.Serialize(data);

你会看到有线格式是:

{"IMEI":"352423061590616"}

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

要解决此问题,请为 Root 容器添加一个额外的类。它有一个来自 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2018-03-02
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多