.net 如何使用 HttpWebRequest 调用接受 byte[] 参数的 Web 服务操作?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/703869/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use HttpWebRequest to call a Web Service Operation that takes in a byte[] parameter?
提问by shergill
I am trying to call a [webmethod] from C#. I can call simple webmethod that take in 'string' parameters. But I have a webmethod that takes in a 'byte[]' parameter. I am running into '500 internal server error' when I try to call it. Here is some example of what I am doing.
我正在尝试从 C# 调用 [webmethod]。我可以调用接受“字符串”参数的简单 web 方法。但是我有一个 webmethod 接受一个 'byte[]' 参数。当我尝试调用它时,我遇到了“500 内部服务器错误”。这是我正在做的一些例子。
Lets say my method is like this
可以说我的方法是这样的
[WebMethod]
public string TestMethod(string a)
{
return a;
}
I call it like this using HttpRequest in C#
我在 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());
}
This works perfectly fine. Now I have another webmethod that is defined like this
这工作得很好。现在我有另一个像这样定义的 webmethod
[WebMethod]
public string UploadFile(byte[] data)
I tried calling it like this
我试着这样称呼它
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);
But that gives me a 500 internal error :(
但这给了我一个 500 内部错误:(
回答by Edgar Chavolla
it is possible, I have done it myself
有可能,我自己做过
First the Header settings, this can be obtained if your webservice can be executed via web and sending the parameters. I use the Developer tools from Chrome. The easy way is to review the description of the webservice (i.e. http ://myweb.com/WS/MyWS.asmx?op=Validation)
首先是 Header 设置,如果您的 webservice 可以通过 web 执行并发送参数,则可以获得此设置。我使用 Chrome 的开发人员工具。简单的方法是查看网络服务的描述(即 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");
Then the request part
然后是请求部分
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();
Now you can get the incoming stream from the response
现在您可以从响应中获取传入流
Remember to adapt the SOAP envelop and the parameters to be sent according to the description given by the page details from the webservice (i.e. http ://myweb.com/WS/MyWS.asmx?op=Validation).
请记住,根据来自 Web 服务的页面详细信息(即 http://myweb.com/WS/MyWS.asmx?op=Validation)给出的描述调整要发送的 SOAP 信封和参数。
回答by Mitch Denny
You are using the HTTP POST/HTTP GET capability of the ASP.NET Web Service plumbing instead of sending an actual web-service call. This is a mechanism that allows you to test simple web services but it isn't really designed for use in a production application. In fact if you navigate to the web-service URL you'll find that it can't even display a test input form for that type of parameter. It might be possible to figure out a way to trick it into working, but to be honest, you should just use it the way it is intended and generate a web service proxy.
您正在使用 ASP.NET Web 服务管道的 HTTP POST/HTTP GET 功能,而不是发送实际的 Web 服务调用。这是一种允许您测试简单 Web 服务的机制,但它并不是真正为在生产应用程序中使用而设计的。事实上,如果您导航到 Web 服务 URL,您会发现它甚至无法显示该类型参数的测试输入表单。或许可以找到一种方法来诱使它工作,但老实说,您应该按照预期的方式使用它并生成 Web 服务代理。
Within Visual Studio right mouse click on the project containing the client code and select Add Service or Web Reference. Then type in the URL to the web-service and it will generate a proxy. If you are using WCF it'll look something like this:
在 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);
Hope this helps.
希望这可以帮助。
回答by custjcy
string postData = "data=abc";
string postData = "数据=abc";
guess you should pass byte array as array, not a base64 string. for example:
猜测您应该将字节数组作为数组传递,而不是 base64 字符串。例如:
string postData = "data=97&data=98&data=99"; //byte array for abc is [97,98,99]
string postData = "data=97&data=98&data=99"; //abc 的字节数组是 [97,98,99]
please refer to https://www.codeproject.com/Tips/457410/Xml-WebService-Array-Parameters
请参考https://www.codeproject.com/Tips/457410/Xml-WebService-Array-Parameters
回答by John Saunders
You will probably need to base64 encode the binary data.
您可能需要对二进制数据进行 base64 编码。
But the 500 error is a clue to look in the Windows event log and see what happened on the server side.
但是 500 错误是查看 Windows 事件日志并查看服务器端发生了什么的线索。

