C#-使用HttpWebRequest将byte []作为json对象的一部分发送 [英] C# - Send byte[] as part of json object using HttpWebRequest

查看:87
本文介绍了C#-使用HttpWebRequest将byte []作为json对象的一部分发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将json对象作为发布数据的一部分发送到网络api.一些json值可以是byte [].这完全可能吗?如果可以,怎么办?

I am trying to send a json object as part of post data to a web api. Some of the json values can be byte[]. Is this at all posiible? If so, how?

这是我的代码:

public static dynamic ExecuteAndReturn(string url, string contentType, string requestType, Dictionary<string, object> parameters)
    {
        try
        {
            System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
            string postData = "";
            if (contentType.Contains("json"))
                postData += "{";
            foreach (string key in parameters.Keys)
            {
                object value = parameters[key];
                if (value.GetType() == typeof(bool))
                    value = value.ToString().ToLower();
                else if (value.GetType() == typeof(byte[]))
                    value = //What to do
                if (contentType.Contains("json"))
                    postData += HttpUtility.UrlEncode(key) + ":" + HttpUtility.UrlEncode(value.ToString()) + ",";
                else
                    postData += HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value.ToString()) + "&";
            }
            if (contentType.Contains("json"))
            {
                if (postData.Length > 1)
                    postData = postData.Substring(0, postData.Length - 1);
                postData += "}";
            }
            byte[] data = Encoding.ASCII.GetBytes(postData);
            request.ContentLength = data.Length;
            request.ContentType = contentType;
            request.Method = requestType;
            request.CookieContainer = new System.Net.CookieContainer();
            foreach (string key in HttpContext.Current.Request.Cookies)
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[key];
                request.CookieContainer.Add(new System.Net.Cookie(cookie.Name, cookie.Value, cookie.Path, new Uri(url).Host));
            }
            using (var sr = request.GetRequestStream())
            {
                sr.Write(data, 0, data.Length);
                sr.Close();
            }
            System.Net.WebResponse response = request.GetResponse();

            using (var sr = new System.IO.StreamReader(response.GetResponseStream()))
            {
                string json = sr.ReadToEnd();
                System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("\\\"__type\\\":\\\"[a-zA-Z]+[\\.]*[a-zA-Z]+\\\",");
                foreach (System.Text.RegularExpressions.Match match in r.Matches(json))
                {
                    json = json.Replace(match.Value, "");
                }
                return (new JavaScriptSerializer()).Deserialize<dynamic>(json);
            }
        }
        catch (System.Net.WebException exception)
        {
            System.Net.HttpWebResponse errorResponse = (System.Net.HttpWebResponse)exception.Response;
            System.IO.Stream resst = errorResponse.GetResponseStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(resst);
            string text = sr.ReadToEnd();
            return new { Error = text };
        }
    }

调用函数如下:

ExecuteAndReturn(
            Objects.SiteContext.Settings["Some_Url"].Value + "/SignOut",
            "application/json; charset=UTF-8",
            "POST",
            new Dictionary<string, object>()
            {
                { "userName", someByte[] },
                { "key", anotherByte[] }
            });

在这里分配byte []值应该是什么:

What should the byte[] value be when assigning it here:

 foreach (string key in parameters.Keys)
            {
                object value = parameters[key];
                if (value.GetType() == typeof(bool))
                    value = value.ToString().ToLower();
                else if (value.GetType() == typeof(byte[]))
                    value = //this should be the byte[] value, what to do
                if (contentType.Contains("json"))
                    postData += HttpUtility.UrlEncode(key) + ":" + HttpUtility.UrlEncode(value.ToString()) + ",";
                else
                    postData += HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value.ToString()) + "&";
            }

推荐答案

如果无法编码为普通字符串并无法在服务器端对其进行解码,请尝试使用json格式的字符串.

If you are unable to encode to a normal string and decode it on the server end, try a string with json formatting.

    byte[] value = new byte[] { 255, 255, 255, 255 };
    string strValue = "[ ";
    for (int i = 0; i < value.Length; i++)
        strValue += (i == 0 ? "" : ", ") + value[i].ToString();
    strValue += " ]";

    // strValue == "[ 255, 255, 255, 255 ]"

这篇关于C#-使用HttpWebRequest将byte []作为json对象的一部分发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆