iT邦幫忙

0

C# Window Form Call ASHX 詢問

想請教.....如何使用於 C# Window Form 中呼叫遠端 ASHX 檔案?或者能夠推薦相關 Resource ?會使用 ASHX 而非 Web API 的原因在於:現行已有不少既成的 ASHX 邏輯檔案存在,不想另外開發 Web API , ASHX 檔案所傳回的是 JSon 格式資料,還請不吝指教,謝謝!!

可以使用 HttpClient 或 HttpWebRequest。

2 個回答

1
PPTaiwan
iT邦新手 4 級 ‧ 2021-02-24 12:00:31
最佳解答

用 HttpWebRequest 來抓取資料 ,以下程式碼試試看傳值可以用 ?objid=a1234 一樣可以導回資料

string _strReturnVaues = string.Empty;
if (_strContentTYpe == null || _strContentTYpe.Length == 0)
{
    _strContentTYpe = "text/html";
}

try
{
    HttpWebRequest _HttpWebRequest = (HttpWebRequest)WebRequest.Create(_strWebSite + _strWebFilesNAME);
    _HttpWebRequest.Method = WebRequestMethods.Http.Get;
    _HttpWebRequest.ContentType = _strContentTYpe;  //"application/json";

    using (var _UsingResponse = (HttpWebResponse)_HttpWebRequest.GetResponse())
    {
        if (_UsingResponse.StatusCode == HttpStatusCode.OK)
        {
            using (var _varStream = _UsingResponse.GetResponseStream())
            {
                using (var _varReader = new StreamReader(_varStream))
                {
                    _strReturnVaues = _varReader.ReadToEnd();
                }
            }
        }
        else
        {
            _ReadErrorMessage = "讀取失敗:" + _UsingResponse.StatusCode.ToString();
            _ReadErrorMessage += "請確定您要讀取的 " + _strWebSite + _strWebFilesNAME + " 是否有存在!!";
        }
    }
}
catch (Exception onerror)
{
    _ReadErrorMessage = onerror.Message;
    //指定為空白的內容
    _strReturnVaues = "";
}
ricknb iT邦新手 5 級 ‧ 2021-02-24 16:06:44 檢舉

感謝!!已經可以 Work 了,剩下只需解決 Json 資料轉換問題即可

PPTaiwan iT邦新手 4 級 ‧ 2021-02-24 19:56:58 檢舉
 //載入資料 >> 預設值
Newtonsoft.Json.Linq.JObject _JObjectReadInfo = JObject.Parse(@"{'Source':'Default'}");


//載入 json 
_JObjectReadInfo = JObject.Parse(JSON Source);

//取得資料
_JObjectReadInfo["你的 JSON 名稱"]

另外可以參考這篇 ,也有相關的介紹
https://www.itread01.com/content/1544814563.html

如果你是用 SQL 2016 以上,可以將查詢的資料直接導出 JSON 格式,不用宣告一堆強型別的 Class 了,ASHX 直接匯出 SQL JSON 的內容就省很多事情。

轉 JSON 格式 FOR JSON PATH,
(輸出 Null)INCLUDE_NULL_VALUES, (排除 [] 格式)WITHOUT_ARRAY_WRAPPER

Select RowName From TableName
FOR JSON PATH,INCLUDE_NULL_VALUES

1
japhenchen
iT邦大師 1 級 ‧ 2021-02-24 16:07:19

用WebClient+POST

using (WebClient wc = new WebClient())
{
  try
  {
      wc.Encoding = Encoding.UTF8;
      
      NameValueCollection nc = new NameValueCollection();
      nc["id"] = "aaa";
      nc["pw"] = "bbb";
      
      byte[] bResult = wc.UploadValues(Config.PostURL, nc);
      
      string resultXML = Encoding.UTF8.GetString(bResult);
  }
  catch (WebException ex)
  {
      throw new Exception("無法連接遠端伺服器");
  }
}

引用出處
https://blog.miniasp.com/post/2010/01/23/Emulate-Form-POST-with-WebClient-class

看更多先前的回應...收起先前的回應...

JSON你可以到nuget下載Newtonsonft.JSON

用法蠻簡單的

using Newtonsoft.Json;
void main()
{
    var dbdata = myContextData.XTABLE.Where(....);
    string jsonstr = JsonConvert.SerializeObject<XTABLE>(dbdata);
    var obj = JsonConvert.DeserializeObject<XTABLE>(jsonstr);
}
//假設你有XTABLE這個Model class在
ricknb iT邦新手 5 級 ‧ 2021-02-24 16:37:31 檢舉

有個小疑問,不管使用 System.Web.Script.Serialization 或者 Newtonsonft.JSON ,作反序列時,如果原 Json String 包含多筆資料(物件),反序列回來時,以此段程式為例,obj會是物件陣列?因為找 Google 的範例,多為單筆資料

你得自己做對應的CLASS,反序列可以是Array[]/IEnumberable(List)/IQueryable

JsonConvert.DeserializeObject<List<T>>(jsonstring);
ricknb iT邦新手 5 級 ‧ 2021-02-25 10:31:24 檢舉

感謝!! Json 資料已能讀出,謝謝各位的解惑 !

我要發表回答

立即登入回答