Asp.net mvc 3 如何发出PUT HttpWebRequest

Asp.net mvc 3 如何发出PUT HttpWebRequest,asp.net-mvc-3,httpwebrequest,Asp.net Mvc 3,Httpwebrequest,我正在尝试与需要PUT更新数据的API集成: 下面是他们使用curl的一个示例: curl——请求放置\ --用户代理“您的客户端名称/1.0”\ --标题“内容类型:应用程序/xml”\ --数据二进制“10”\ https://www.example.com/api/v2/orders/101 但是,我需要使用.NETMVC3使用JSON(它们也支持JSON)。你知道我该怎么做吗 我使用以下代码成功获取: Order obj = Call<Order>(url, "GET");

我正在尝试与需要PUT更新数据的API集成:

下面是他们使用curl的一个示例:

curl——请求放置\
--用户代理“您的客户端名称/1.0”\
--标题“内容类型:应用程序/xml”\
--数据二进制“10”\
https://www.example.com/api/v2/orders/101
但是,我需要使用.NETMVC3使用JSON(它们也支持JSON)。你知道我该怎么做吗

我使用以下代码成功获取:

Order obj = Call<Order>(url, "GET");

    private T Call<T>(string url, string methodType) where T : class {
        T result;
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = methodType;
        request.Accept = "application/json";
        request.ContentType = "application/json";

        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        using (StreamReader reader = new StreamReader(response.GetResponseStream())) {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string jsonData = reader.ReadToEnd();
            result = (T)jsSerializer.Deserialize<T>(jsonData);
        }

        return result;
    }
订单obj=Call(url,“GET”); 私有T调用(字符串url,字符串方法类型),其中T:class{ T结果; HttpWebRequest-request=WebRequest.Create(url)为HttpWebRequest; request.Method=methodType; request.Accept=“application/json”; request.ContentType=“application/json”; 使用(HttpWebResponse=request.GetResponse()作为HttpWebResponse) 使用(StreamReader=newstreamreader(response.GetResponseStream()){ JavaScriptSerializer jsSerializer=新的JavaScriptSerializer(); 字符串jsonData=reader.ReadToEnd(); 结果=(T)jsSerializer.Deserialize(jsonData); } 返回结果; } 但是,我可以使用类似的方法发布PUT吗

Order obj = Call<Order>(url, "PUT");
orderobj=Call(url,“PUT”);

如果是这样的话,我应该把“数据二进制”中需要的数据放在哪里呢?

好吧,这里有一个可能的原点-未经测试;直接写入浏览器;不是生产代码;假设PUT调用发送和接收相同的对象类型(可能不是这种情况)

主要的补充是,您需要提供请求的ContentLength,并且需要将序列化的JSON对象写入请求流,这将通过调用HttpWebRequest::GetRequestStream()获得。这与发布时的方法相同

private T Call<T>(string url, string methodType, T data) where T: class
{
    T result;

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = methodType;
    request.ContentType = "application/json";
    request.Accept = "application/json";

    if (methodType == "PUT" || methodType == "POST")
    {
       JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
       string jsonData = jsSerializer.Serialize(data);

       byte[] arrData = Encoding.UTF8.GetBytes(jsonData);
       request.ContentLength = arrData.Length;

       using (Stream dataStream = request.GetRequestStream())
       {
          dataStream.Write(arrData, 0, arrData.Length);
       }
    }

    // Note: You may not need to parse any response content,
    // or it may be a different class
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader 
                          = new StreamReader(response.GetResponseStream()))
        {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string jsonData = reader.ReadToEnd();
            result = (T)jsSerializer.Deserialize<T>(jsonData);
        }
    }
    return result;
}
private T调用(字符串url、字符串methodType、T数据),其中T:class
{
T结果;
HttpWebRequest-request=WebRequest.Create(url)为HttpWebRequest;
request.Method=methodType;
request.ContentType=“application/json”;
request.Accept=“application/json”;
if(methodType==“PUT”| | methodType==“POST”)
{
JavaScriptSerializer jsSerializer=新的JavaScriptSerializer();
字符串jsonData=jsSerializer.Serialize(数据);
byte[]arrData=Encoding.UTF8.GetBytes(jsonData);
request.ContentLength=arrData.Length;
使用(Stream dataStream=request.GetRequestStream())
{
dataStream.Write(arrData,0,arrData.Length);
}
}
//注意:您可能不需要解析任何响应内容,
//或者它可能是一个不同的类
使用(HttpWebResponse=request.GetResponse()作为HttpWebResponse)
{
使用(StreamReader)
=新的StreamReader(response.GetResponseStream())
{
JavaScriptSerializer jsSerializer=新的JavaScriptSerializer();
字符串jsonData=reader.ReadToEnd();
结果=(T)jsSerializer.Deserialize(jsonData);
}
}
返回结果;
}
private T Call<T>(string url, string methodType, T data) where T: class
{
    T result;

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = methodType;
    request.ContentType = "application/json";
    request.Accept = "application/json";

    if (methodType == "PUT" || methodType == "POST")
    {
       JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
       string jsonData = jsSerializer.Serialize(data);

       byte[] arrData = Encoding.UTF8.GetBytes(jsonData);
       request.ContentLength = arrData.Length;

       using (Stream dataStream = request.GetRequestStream())
       {
          dataStream.Write(arrData, 0, arrData.Length);
       }
    }

    // Note: You may not need to parse any response content,
    // or it may be a different class
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader 
                          = new StreamReader(response.GetResponseStream()))
        {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string jsonData = reader.ReadToEnd();
            result = (T)jsSerializer.Deserialize<T>(jsonData);
        }
    }
    return result;
}