首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Swift Alamofire 呼叫 C# ASMX Web Service 完整實作

     編輯:程式設計綜合問答

問題背景

iOS 專案使用 Alamofire 呼叫 C# 舊式 ASMX Web Service(非 WCF/REST),直接 POST JSON 失敗,回傳 HTTP 500 與 HTML 錯誤頁面,而非預期 JSON。

根本原因

ASMX 預期 **SOAP 協定**(XML 格式),而非裸 JSON。Android 端可能已自行組裝 SOAP 封包,或伺服器端有額外處理。iOS 端需依照 SOAP 規範發送請求。

正確實作:手動組裝 SOAP 封包

func callASMXService() {
    let urlString = "https://115.29.41.12:83/serForImccoy.asmx"
    let action = "https://imccoy.com/webservices/isUser"
    let soapMessage = buildSoapMessage(method: "isUser", params: ["userId": "test", "pwd": "pwd"])

    var request = URLRequest(url: URL(string: urlString)!)
    request.httpMethod = "POST"
    request.setValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") // 關鍵:ASMX 需 text/xml
    request.setValue(action, forHTTPHeaderField: "SOAPAction")
    request.setValue("\(soapMessage.utf8.count)", forHTTPHeaderField: "Content-Length")
    request.httpBody = soapMessage.data(using: .utf8)

    AF.request(request).responseString { response in
        switch response.result {
        case .success(let xmlString):
            print("原始 XML 回應:\(xmlString)")
            // 解析 XML 取得結果
        case .failure(let error):
            print("請求失敗:\(error)")
        }
    }
}

func buildSoapMessage(method: String, params: [String: String]) -> String {
    var xml = ""
    xml += ""
    xml += ""
    xml += "<\(method) xmlns=\"https://imccoy.com/webservices/\">"
    for (key, value) in params {
        xml += "<\(key)>\(value)"
    }
    xml += ""
    xml += ""
    xml += ""
    return xml
}

關鍵點總結

  1. Content-Type 必須為 text/xml; charset=utf-8,而非 application/json 或 application/soap+xml(ASMX 1.0 不支援 SOAP 1.2)。
  2. SOAPAction Header 需符合 WSDL 定義的命名空間 + 方法名。
  3. 請求主體為完整 SOAP Envelope XML,參數放在 <方法名> 子元素中。
  4. 回應為 XML,需用 XMLParser 或第三方庫(如 AEXML、SWXMLHash)解析。

替代方案

  • 伺服器端改為 **ASP.NET Core Web API** 回傳 JSON,iOS 直接用 AF.request(..., parameters: ..., encoder: JSONParameterEncoder.default)。
  • 使用 Alamofire 搭配 SOAPEngine 等第三方庫自動處理 SOAP 序列化。

正確組裝 SOAP 封包並設定正確 Header,即可順利串接舊版 ASMX 服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved