5

C# から [webmethod] を呼び出そうとしています。「文字列」パラメーターを受け取る単純な webmethod を呼び出すことができます。しかし、'byte[]' パラメータを受け取る Web メソッドがあります。呼び出しようとすると、「500 内部サーバー エラー」が発生します。これが私がやっていることの例です。

私の方法がこのようなものだとしましょう

[WebMethod]
public string TestMethod(string a)
{
    return a;
}

C#でHttpRequestを使用してこのように呼び出します

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Credentials = CredentialCache.DefaultCredentials;
            req.Method = "POST";
            // Set the content type of the data being posted.
            req.ContentType = "application/x-www-form-urlencoded";

            string inputData = "sample webservice";
            string postData = "a=" + inputData;
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] byte1 = encoding.GetBytes(postData);

            using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
            {
                StreamReader sr = new StreamReader(res.GetResponseStream());
                string txtOutput = sr.ReadToEnd();
                Console.WriteLine(sr.ReadToEnd());
            }

これは完全に正常に機能します。今、私はこのように定義された別の webmethod を持っています

[WebMethod]
public string UploadFile(byte[] data)

こんな風に呼んでみた

            ASCIIEncoding encoding = new ASCIIEncoding();
            string postData = "data=abc";
            byte[] sendBytes = encoding.GetBytes(postData);
            req.ContentLength = sendBytes.Length;
            Stream newStream = req.GetRequestStream();
            newStream.Write(sendBytes, 0, sendBytes.Length);

しかし、それは私に500の内部エラーを与えます:(

4

4 に答える 4

5

それは可能です、私はそれを自分でやった

まずヘッダー設定です。これは、Web サービスを Web 経由で実行してパラメーターを送信できる場合に取得できます。Chrome の開発者ツールを使用しています。簡単な方法は、Web サービスの説明を確認することです (つまり、http://myweb.com/WS/MyWS.asmx?op=Validation)。

WebRequest request = WebRequest.Create(http://myweb.com/WS/MyWS.asmx?op=Validation);
request.Method = "POST";
((HttpWebRequest)request).UserAgent = ".NET Framework Example Client";
request.ContentType = "text/xml; charset=utf-8";
((HttpWebRequest)request).Referer = "http://myweb.com/WS/MyWS.asmx?op=Validation";
((HttpWebRequest)request).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
((HttpWebRequest)request).Host= "myweb.com";
 request.Headers.Add("SOAPAction","http://myweb.com/WS/Validation");

次に、リクエスト部分

string message = "a=2";
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
        "<soap:Body><Validation xmlns=\"http://myweb.com/WS\"><data>@Data</data></Validation></soap:Body></soap:Envelope>";
string SOAPmessage = envelope.Replace("@Data",   System.Web.HttpUtility.HtmlEncode(message));
// The message must be converted to bytes, so it can be sent by the request
byte[] data = Encoding.UTF8.GetBytes(SOAPmessage);
request.ContentLength = data.Length;
request.Timeout = 20000;
Stream dataStream = request.GetRequestStream();
dataStream.Write(data, 0, data.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
Stream inputStream = response.GetResponseStream(); 

これで、応答から着信ストリームを取得できます

SOAP エンベロープと送信されるパラメーターを、Web サービスのページの詳細 (つまり、http://myweb.com/WS/MyWS.asmx?op=Validation) の説明に従って調整することを忘れないでください。

于 2013-01-16T19:16:27.037 に答える
3

実際の Web サービス呼び出しを送信する代わりに、ASP.NET Web サービス プラミングの HTTP POST/HTTP GET 機能を使用しています。これは、単純な Web サービスをテストできるメカニズムですが、実稼働アプリケーションで使用するようには設計されていません。実際、Web サービスの URL に移動すると、そのタイプのパラメーターのテスト入力フォームを表示することさえできないことがわかります。だまして機能させる方法を見つけ出すことは可能かもしれませんが、正直なところ、意図したとおりに使用して、Web サービス プロキシを生成する必要があります。

Visual Studio 内で、クライアント コードを含むプロジェクトを右クリックし、[サービスまたは Web 参照の追加] を選択します。次に、Web サービスへの URL を入力すると、プロキシが生成されます。WCF を使用している場合は、次のようになります。

// ServiceNameClient is just a sample name, the actual name of your client will vary.
string data = "abc";
byte[] dataAsBytes = Encoding.UTF8.GetBytes(data);
ServiceNameClient client = new ServiceNameClient();
client.UploadFile(dataAsBytes);

お役に立てれば。

于 2009-04-01T04:16:23.757 に答える
0

おそらく、バイナリ データを base64 でエンコードする必要があります。

しかし、500 エラーは、Windows イベント ログを調べて、サーバー側で何が起こったのかを調べる手がかりになります。

于 2009-04-01T02:59:46.780 に答える