簡體   English   中英

C# 應用程序在對 python http 服務器的 POST 請求期間掛起

[英]C# application hangs during POST request to python http server

我有一個 C# 應用程序向在 Python 中創建的簡單 http 服務器發出 post 請求,但我的請求永遠不會“完成”,並且不會超過發出異步 POST 請求的進度。 這是我從我的客戶(C# 應用程序)打來的電話:

private void sendPost(HttpClientAdaptor client, MyDataObject myDataObject) {
   

    var payload = JsonConvert.SerializeObject(myDataObject);
    var content = new StringContent(payload, Encoding.UTF8, "application/json");

    try {
        if (client.isDisposed) {
            return;
        }

        var response = client?.PostAsync(ApiEndpoint, content); // this hangs forever

我用python編寫的http服務器:

#!/usr/bin/env python3
"""
Very simple HTTP server in python for logging requests
Usage::
    ./server.py [<port>]
"""
from http.server import BaseHTTPRequestHandler, HTTPServer
import logging
from io import BytesIO


class S(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'This is POST request. ')
        response.write(b'Received: ')
        response.write(body)
        self.wfile.write(response.getvalue())

def run(server_class=HTTPServer, handler_class=S, port=5000):
    logging.basicConfig(level=logging.INFO)
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    logging.info('Starting httpd...\n')
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    logging.info('Stopping httpd...\n')

if __name__ == '__main__':
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()

我知道請求正在發送到我的服務器,因為我使用了一些打印語句來打印有效負載,但我的客戶端似乎從未確認來自我的服務器的 200 響應。 我已經驗證服務器正在運行,我沒有混淆端口,並且 GET 請求通過瀏覽器工作。

我懷疑我的 python 服務器出了點問題,以至於它沒有“完成”交易,因此我的客戶沒有得到響應。

順便說一句:有沒有更簡單的方法來為我的客戶端啟動一個 http 服務器(用 C# 編寫的 Windows 應用程序)? 我只需要一種返回 200 狀態的方法。

您正在使用異步函數並且沒有等待它。

代替

var response = client?.PostAsync(ApiEndpoint, content);

嘗試

  var response = await client?.PostAsync(ApiEndpoint, content);

並更改您的方法簽名

private void sendPost

private async Task sendPost

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM