这个Java代码在C#中是什么样的? (setRequestEntity)

时间:2016-06-02 13:50:05

标签: java c#

有一个用Java开发的HTTP服务器利用HttpServletRequestHttpServletResponse等。在这个服务器中有一个方法可以通过“POST”调用并接收一个参数,一个巨大的字符串

通常这个方法由Java应用程序调用,它工作正常,用于调用的代码如下:

MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
PostMethod post = new PostMethod(this.serverUrl);
post.setRequestEntity(new CrossTalkRequestEntity(msg));
HttpClient cli = new HttpClient(connectionManager);
int code = cli.executeMethod(post);

要发送的参数是msg变量,看看没有命名参数来执行POST。

问题是:当我尝试对此服务器执行POST时,我无法在没有命名参数的情况下发送string参数,以下代码是服务器获取参数值的方式: / p>

requestMessage = JaxbHelper.createContextAndUnmarshal(CrossTalkMessage.class, request.getInputStream());

看看服务器没有按名称获取参数,只需调用request.getInputStream()并获取值。

我已经尝试了很多方法来实现这一点,现在我正在尝试使用下面的方法调用,但它无法正常工作,因为我传递了一个命名参数value而没有设置请求实体像Java调用(setRequestEntity)。

      public static string Post(string address, string data)
        {
            string responseFromServer = string.Empty;
            WebResponse response = null;

            WebRequest request = WebRequest.Create(address);
            request.Method = "POST";
            byte[] byteArray = Encoding.UTF8.GetBytes("value=" + data);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;

            var dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            response = request.GetResponse();
            dataStream = response.GetResponseStream();

            using (var reader = new StreamReader(dataStream))
            {
                responseFromServer = reader.ReadToEnd();
            }

            response.Close();
}

如何在c#中调用此HTTP服务器并传递Java这样的参数?

修改 有类CrossTalkRequestEntity的代码:

class CrossTalkRequestEntity implements RequestEntity {

                private final byte[] data;

                CrossTalkRequestEntity(CrossTalkMessage msg) {
                               ByteArrayOutputStream out = new ByteArrayOutputStream();
                               try {
                                               JaxbHelper.createContextAndMarshal(CrossTalkMessage.class, msg, out);
                               } finally {
                                               try {
                                                               out.flush();
                                                               out.close();
                                               } catch (IOException e) {
                                               }
                               }
                               this.data = out.toByteArray();
                }

                @Override
                public boolean isRepeatable() {
                               return true;
                }

                @Override
                public void writeRequest(OutputStream out) throws IOException {
                               out.write(data);
                }

                @Override
                public long getContentLength() {
                               return data.length;
                }

                @Override
                public String getContentType() {
                               return "text/xml";
                }
}

1 个答案:

答案 0 :(得分:1)

在您的代码上挖掘一下后,问题就是您的请求的内容类型,您的原始Java代码将内容发送为“text / xml”,而您的C#代码将其发送为“application / x-www-form- urlencoded的”。

将ContentType更改为“text / xml”,它将起作用。