C 報錯 在寫入所有位元組之前不能關閉流

2021-06-28 18:53:12 字數 1717 閱讀 6560

今天,做乙個c# 進行http post 傳送檔案的功能,將乙個xml檔案中的內容傳送到指定伺服器,以下是主要**:

報錯的是:「mystreamwriter.close()」 這一行,意思是說在呼叫close()方法的時候還沒有寫完全部位元組,怎麼會這樣呢?

按理說,c#提供write()、close()這類方法,應該是非常成熟可靠的,怎麼寫位元組,寫多少位元組,這兩個方法應該都是照章辦事,如果出錯,那一定是其他地方的問題。

仔細想想,很可能是wirte()方法在執行到某個點的時候,雖然還沒寫完,但close()方法已經按照它收到的命令進行關閉操作了,那麼,close()方法接到的指令可能是什麼呢?

仔細觀察上下文**,這個關閉的依據很可能就是「request.contentlength」 這個點。

於是,先把「request.contentlength = encoding.utf8.getbytecount(postdatastr);」 給注釋掉,進行測試:

= encoding.utf8.getbytecount(postdatastr);
結果這次沒報錯,傳送成功了!

看來問題果然是這個http請求的 contentlength 的問題。接著做乙個測試:

1. 記下postdatastr內容的長度,結果是 31317,

2. 在伺服器端觀察實際收到的內容長度,結果是 31320,,

很顯然,是實際發出的長度更大,所以如果把request.contentlength 設定成乙個更小的數字,那麼也許close()方法就會提前呼叫,導致報錯。

因此解決辦法就是不要手動指定request的contentlength,讓程式按預設的規則辦事。

為什麼全域性變數在賦值之前呼叫會報錯

參考文獻 一 在宣告區域性變數前,呼叫區域性變數返回undefindfunction f f undefind二 在全域性變數賦值前,呼叫全域性變數會報error a is not definedfunction f f error a is not defined思考 上面兩個例子都是在沒有賦值之...

在XmlTextWriter中寫入乙個cdata

在cdata可以用來寫出像 這個樣的html標記或任何其他標記。您不能新增乙個簡單的寫writeelementstring這些標籤的功能。將字元 轉換成 下面的例子給出了使用writeelementstring來寫入乙個cdata區域。首先新增引用 using system.xml 程式中這樣來寫 ...

C語言 設定在main 之前執行的函式

include void before attribute constructor void after attribute destructor void before void after int main int argc,char argv 指定了函式在main之前或之後執行。當然也可以指派...