ASP.NET MVC Web API 4 REST Web服务:放置/发布对象列表

ASP.NET MVC Web API 4 REST Web服务:放置/发布对象列表,rest,asp.net-web-api,Rest,Asp.net Web Api,想知道是否可以和/或支持将整个对象放置/发布到REST Webservice,而不仅仅是一些名称/值对 如果是,是否也可以放置/发布对象列表 我想这是可能的,因为GET请求能够返回对象列表,所以我希望对更新的对象执行“反向”操作(而不是一次发送一个对象,或者更糟的是,通过名称/值对以单个片段的形式发送) 我知道这是一个非常基本的问题,但到目前为止,我所采取的方法是尝试对PUT进行编码并使其工作(如果PUT函数没有参数,则工作正常,如: public class AObjectController

想知道是否可以和/或支持将整个对象放置/发布到REST Webservice,而不仅仅是一些名称/值对

如果是,是否也可以放置/发布对象列表

我想这是可能的,因为GET请求能够返回对象列表,所以我希望对更新的对象执行“反向”操作(而不是一次发送一个对象,或者更糟的是,通过名称/值对以单个片段的形式发送)

我知道这是一个非常基本的问题,但到目前为止,我所采取的方法是尝试对PUT进行编码并使其工作(如果PUT函数没有参数,则工作正常,如:

public class AObjectController : ApiController
{
    public List<int[]> Put()
    {
        List<int[]> ret = new List<int[]>();

        ret.Add(new int[] {-1, 1111});
        ret.Add(new int[] {-2, 2222});

        return ret;
    }
公共类AObjectController:ApicController
{
公共列表Put()
{
List ret=新列表();
ret.Add(新的int[]{-1111});
ret.Add(新的int[]{-2222});
返回ret;
}
如果指定单个对象或对象列表,则会出现异常:

    public List<int[]> Put(AObject object)         **CASE 1**
    public List<int[]> Put(List<AObject> objects)  **CASE 2**
    {
        List<int[]> ret = new List<int[]>();

        ret.Add(new int[] { -1, 1111 });
        ret.Add(new int[] { -2, 2222 });

        return ret;
    }
public List Put(aoobject对象)**CASE 1**
公共列表放置(列表对象)**案例2**
{
List ret=新列表();
ret.Add(新的int[]{-1111});
ret.Add(新的int[]{-2222});
返回ret;
}

案例1:公共列表(int[])放置(AOObject对象)



案例2:公共列表(int[])放置(列表(AOObject)对象)



以下是进行呼叫的客户端的代码:

    public int writeAll(List<T> data)
    {
        _sendBuffer = 
            JsonConvert.SerializeObject(
                tabletData,
                new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
            );

        byte[] b = StringHelper.GetBytes(_sendBuffer);

        string url = ContructUrlRequest(null, null);

        WebRequest request = WebRequest.Create(url);

        request.Method = "PUT";
        request.ContentType = "application/json";
        request.ContentLength = b.Length;
        request.Credentials = CredentialCache.DefaultCredentials;
        ((HttpWebRequest)request).UserAgent = "...";
        //((HttpWebRequest)request).AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(b, 0, b.Length);
            requestStream.Flush();
            requestStream.Close();
        }

        WebResponse response = request.GetResponse();

        if (response == null)
        {

            return -1;
        }

        StreamReader sr = new StreamReader(response.GetResponseStream()); ;

        _recieveBuffer = sr.ReadToEnd();

        List<int[]> _resultData = JsonConvert.DeserializeObject<List<int[]>>(
            _recieveBuffer,
            new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
        );

        return data.Count;
    }
public int-writeAll(列表数据)
{
_发送缓冲区=
JsonConvert.SerializeObject(
tabletData,
新JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All}
);
byte[]b=StringHelper.GetBytes(\u sendBuffer);
字符串url=ContrstructuralRequest(null,null);
WebRequest=WebRequest.Create(url);
request.Method=“PUT”;
request.ContentType=“application/json”;
request.ContentLength=b.长度;
request.Credentials=CredentialCache.DefaultCredentials;
((HttpWebRequest)请求).UserAgent=“…”;
//((HttpWebRequest)请求)。AutomaticDecompression=DecompressionMethods.GZip | DecompressionMethods.Deflate;
使用(Stream requestStream=request.GetRequestStream())
{
Write(b,0,b.Length);
requestStream.Flush();
requestStream.Close();
}
WebResponse=request.GetResponse();
如果(响应==null)
{
返回-1;
}
StreamReader sr=新的StreamReader(response.GetResponseStream());
_ReceiveBuffer=sr.ReadToEnd();
列表_resultData=JsonConvert.DeserializeObject(
_接收缓冲区,
新JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All}
);
返回数据。计数;
}

谢谢。

在我的客户端使用了来自服务器的序列化写入代码,并且工作正常

    public int writeAll(List<AObject> aObjects)
    {
        string url = ContructUrlRequest(null, null);

        WebRequest request = WebRequest.Create(url);
        request.Method = WebRequestMethods.Http.Put;
        request.ContentType = "application/json; charset=utf-8";            
        request.Credentials = CredentialCache.DefaultCredentials;
        ((HttpWebRequest)request).UserAgent = "going insane";

        JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
        serializerSettings.TypeNameHandling = TypeNameHandling.Objects | TypeNameHandling.Arrays;
        serializerSettings.Converters.Add(new IsoDateTimeConverter());

        JsonSerializer serializer = JsonSerializer.Create(serializerSettings);

        using (Stream requestStream = request.GetRequestStream())
        {
            using (StreamWriter streamWriter = new StreamWriter(requestStream, new UTF8Encoding(false, true)))
            {
                using (JsonTextWriter jsonTextWriter = new JsonTextWriter(streamWriter))
                {
                    serializer.Serialize(jsonTextWriter, aObjects);
                }
            }
        }

        WebResponse response = request.GetResponse();

        if (response == null)
        {
            Log.Info(FIDB.TAG_WSBUFFER, "WSBuffer.writeAll: response = NULL");

            return -1;
        }

        StreamReader sr = new StreamReader(response.GetResponseStream());

        _recieveBuffer = sr.ReadToEnd();

        _resultData = JsonConvert.DeserializeObject<List<int[]>>(
            _recieveBuffer,
            new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
        );

        return tabletData.Count;
    }
public int-writeAll(列出对象)
{
字符串url=ContrstructuralRequest(null,null);
WebRequest=WebRequest.Create(url);
request.Method=WebRequestMethods.Http.Put;
request.ContentType=“application/json;charset=utf-8”;
request.Credentials=CredentialCache.DefaultCredentials;
((HttpWebRequest)请求);
JsonSerializerSettings serializerSettings=新的JsonSerializerSettings();
serializerSettings.TypeNameHandling=TypeNameHandling.Objects | TypeNameHandling.Array;
serializerSettings.Converters.Add(新的IsoDateTimeConverter());
JsonSerializer serializer=JsonSerializer.Create(serializerSettings);
使用(Stream requestStream=request.GetRequestStream())
{
使用(StreamWriter StreamWriter=newstreamwriter(requestStream,newutf8encoding(false,true)))
{
使用(JsonTextWriter JsonTextWriter=newjsontextwriter(streamWriter))
{
serializer.Serialize(jsonTextWriter,aoobjects);
}
}
}
WebResponse=request.GetResponse();
如果(响应==null)
{
Log.Info(FIDB.TAG_WSBUFFER,“WSBUFFER.writeAll:response=NULL”);
返回-1;
}
StreamReader sr=新的StreamReader(response.GetResponseStream());
_ReceiveBuffer=sr.ReadToEnd();
_resultData=JsonConvert.DeserializeObject(
_接收缓冲区,
新JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All}
);
返回tabletData.Count;
}

你能和我们分享一下你得到的例外情况吗?是的,现在抓取并发布客户端代码(正在进行中)。你应该使用
HttpClient
这是Web Api的官方客户端,它在引擎盖下支持Json.Net,@Cuong Le我会给HttpClient一个机会,但是我记得使用HttpWebRequest失败了(当我在项目开始时阅读/从webservice获取信息时),当我使用普通的WebRequest时,事情“刚刚起作用”。我需要研究这是否是一个相关问题,谢谢。可能只是我需要指定UTF-8的字符集……我想真正的问题是,我设置了错误的内容长度(request.ContentLength=StringHelper.GetBytes(_sendBuffer).Length),b/c在使用这里的方法并且没有指定ContentLength之后,我注意到在服务器端(步骤调试时),同一对象的内容长度是原来的一半。