注册

关于环信.net服务端demo的一点补充(解决出错无法返回json格式的问题)

前段时间做基于.net的环信服务端开发 。
.net的demo链接地址如下:
https://github.com/easemob/emchat-server-examples/blob/master/emchat-server-dotnet/EaseMobDemo.cs
发现示例demo有一个比较关键的问题没有解决,
就是EaseMobDemo的public   string   ReqUrl(string reqUrl, string method, string paramData, string token)
这个函数,如果stream流读取resp发生错误的话,无法返回json类型的字符串,而是直接400,500之类的错误,
结果无法获得json字符串格式。
 
例如:注册用户时,如果用户已经存在,按照原来的代码
       会返回 {"远程服务器返回错误: (400) 错误的请求。"}
       这个不是json格式,无法用程序反序列化。
       后来发现Java的服务端demo,如果出错是可以返回json格式的错误代码。
       向环信客服咨询,也没人知道怎么做。
 
      经过研究把代码做了一下修改,前面代码不变,只是把错误捕捉的部分作了修改,增加了一个函数
 
      public   string   ReqUrl(string reqUrl, string method, string paramData, string token)
        {
            try
            {
                HttpWebRequest  request = WebRequest.Create(reqUrl) as HttpWebRequest;
                request.Method = method.ToUpperInvariant();
                request.ContentType = "application/json";

                if (!string.IsNullOrEmpty(token) && token.Length > 1)
                {
                    request.Headers.Add("Authorization", "Bearer" +" "+ token);
                }
     
                if (request.Method.ToString().Trim() != "GET"  &&  !string.IsNullOrEmpty(paramData)  &&  paramData.Length > 0)
                {
                    byte buffer = Encoding.UTF8.GetBytes(paramData);
                    request.ContentLength = buffer.Length;
                    request.GetRequestStream().Write(buffer, 0, buffer.Length);
                }

                 using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
                 {
                     using (StreamReader stream = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
                     {
                        return stream.ReadToEnd();
                    }
                }

            }
            catch (WebException e)
            {
                return GetErrorInfo(e);
            }

        }

        ///
        /// 增加此方法,用户可以返回json格式错误。
        ///
        ///
        ///
        private  string  GetErrorInfo(WebException ex)
        {
            string  errorinfo = "";
            HttpWebResponse  resp = (HttpWebResponse)ex.Response;
             if (ex.Status == WebExceptionStatus.ProtocolError)
            {
                using (StreamReader streamreader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
                {
                        errorinfo = streamreader.ReadToEnd();
                 }
            }
               return   errorinfo;
        }
 
这样就是发生错误,也返回json格式。
以下是注册已经存在的用户,错误返回格式
{
    "error":"duplicate_unique_property_exists",
    "timestamp":1452661004439,
    "duration":0,
    "exception":"org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException",
    "error_description":"Application fbd110b0-884d-11e5-8f9c-e94cec2e0ad0 Entity user requires that property named  username be unique, value of fan exists"
}
为其他开发者少走弯路,提供一定的参考。

2 个评论

果然如此。用.net demo 在调rest接口 的时候,出错只看到错误码 ,看不到error_description具体错误。 用了作者 的方法很快就定义到问题解决了。五星好评!
https://www.imgeek.org/article/825308176 试下吧,dotnetSDK,集成所有API,调用方便,统一错误日志输出,方便排查,标准和简洁的节点配置,免除硬编码造成的修改问题

要回复文章请先登录注册