2012-03-12 11 views
3

VS2010、Cの#、.NET 4WebRequestクラスとWebMethodの相互運用

私は2つのアプリケーション作成:Webサービスを、Windowsが(両方とも同じPC上で実行されている)アプリケーションを構成しています。ここでは、コードです:

WEBSERVICE:

public class Service1 : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public string HelloWorld() 
    { 
     return "message"; 
    } 
} 

WINDOWSアプリケーション:

HttpWebRequest req =(HttpWebRequest)WebRequest.Create("http://localhost:20848/Service1.asmx/HelloWorld"); 

req.Credentials = CredentialCache.DefaultCredentials; 
req.Method = "POST";     
//Set the content type of the data being posted. 
req.ContentType = "application/text"; 

WebResponse res = req.GetResponse(); 

StreamReader sr = new StreamReader(res.GetResponseStream()); 
string txtOutput = sr.ReadToEnd(); 
Console.WriteLine(sr.ReadToEnd()); 

これは正常に動作します。私はメッセージを含んでいるWebサービスからの応答を得ます。

Webサービス:

public class Service1 : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public string HelloWorld(string message) 
    { 
     return message; 
    } 
} 

WINDOWSフォームアプリケーションを: は今、私はこれにアプリケーション2つのアプリケーションを変更

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:20848/Service1.asmx/HelloWorld"); 

req.Credentials = CredentialCache.DefaultCredentials; 
req.Method = "POST"; 
string inputData = "sample webservice"; 
string postData = "message=" + inputData; 

byte[] byte1 = System.Text.ASCIIEncoding.ASCII.GetBytes(postData); 
req.ContentLength = byte1.Length; 
Stream postdataStream = req.GetRequestStream(); 

//Set the content type of the data being posted. 
req.ContentType = "application/text"; 

postdataStream.Write(byte1, 0, byte1.Length); 

WebResponse res = req.GetResponse(); 

StreamReader sr = new StreamReader(res.GetResponseStream()); 
string txtOutput = sr.ReadToEnd(); 
Console.WriteLine(sr.ReadToEnd()); 

これは(req.GetResponseで失敗します)。 "それは、基本的な接続が閉じていると言います"。誰かがここでコードの何が間違っているか教えてもらえますか?注 - 私はWebRequestsのみでWebMethodsにアクセスする必要があります。私はWeb参照を追加したくありません。

+2

何をやっているのですか?なぜあなたは "サービス参照の追加"を使用しませんか?新しい開発のためにASMXサービスと「Web参照の追加」を使用すべきではありません。 –

+0

SOAPまたは "HttpPost"を実行するようにサービスが設定されていますか? –

+0

Webサービス参照を追加できない理由を説明すると、誰かがあなたをより良く助けることができるかもしれません。実用的な立場からはほとんど意味がありません。 – kprobst

答えて

0

GetResponse()を呼び出す前に要求ストリームを閉じないことがわかりました。私はそれをテストしていませんが、docsの例では要求ストリームが閉じられます。いずれにせよ、それは良い習慣なので、まずそれを試してみてください。

I.e.

postdataStream.Write(byte1, 0, byte1.Length); 
postDataStream.Close(); 
WebResponse res = req.GetResponse(); 
+0

それはまだ同じエラー – user1265068

+0

OKを与えようとしました。パケットスニファ(Fiddler、Wiresharkなど)を分解してください。リクエストは実際に送信されますか?で、それはサーバーが接続を閉じているのですか?フレームワークはそれを送信しないのですか?試みるべき他のもの... application/text ...それは単純なテキストです。テキスト/プレーンではありませんか? ASCIIコードを使用していることがわかりました。私は手にhttpの仕様はありませんが、私はUTF8に亀裂を与えるでしょう。 –