C# 使用 Web API 使用 Java Web 服务(没有可用的 WSDL)

Posted

技术标签:

【中文标题】C# 使用 Web API 使用 Java Web 服务(没有可用的 WSDL)【英文标题】:C# Consuming Java web service with Web API (NO WSDL available) 【发布时间】:2015-03-06 18:50:44 【问题描述】:

我需要创建一个使用 Java 1.4 Web 服务的 c# 应用程序。这个 Web 服务没有 WSDL,不,我不能让他们创建一个,我必须使用这个服务。

返回的内容类型为 Content-Type: multipart/form-data 任意边界。来自 fiddler 的内容如下所示:

HTTP/1.0 200 OK
Content-Type: multipart/form-data; boundary=---------------------------MultiPartFormControl7d2fb2f20039a

Servlet-Engine: Tomcat Web Server/3.2.3 (JSP 1.1; Servlet 2.2; Java 1.4.2_11; Linux 2.6.18-371.8.1.el5 i386; java.vendor=Sun Microsystems Inc.)

-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307234.xml" filename="806307234.xml"
Content-Type: application/octet-stream

<*XML contents go here*>    
-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307873.jpg" filename="806307873.jpg"
Content-Type: image/jpeg

<*binary data goes here*>    
-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307876.jpg" filename="806307876.jpg"
Content-Type: image/jpeg

<*binary data goes her**>    
-----------------------------MultiPartFormControl7d2fb2f20039a

在尝试使用 .ReadAsMultipartAsync() 时,我在尝试将结果返回到 MultipartMemoryStreamProvider 时遇到以下错误:

解析数据段 System.Byte[] 的 MIME 多部分正文部分标头字节 143 时出错>

这是我的代码 sn-p:

Uri webServiceUri = new Uri(@"http://endpoint");

string document = @"Contains XML for SOAP call";

HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, webServiceUri);
HttpContent stringContent = new StringContent(document, Encoding.UTF8, "text/xml");
requestMessage.Content = stringContent;

HttpClient client = new HttpClient();
Task<HttpResponseMessage> httpRequest = client.SendAsync(requestMessage,
HttpCompletionOption.ResponseHeadersRead, CancellationToken.None);

HttpResponseMessage httpResponse = httpRequest.Result;
HttpContent returnContent = httpResponse.Content;

Task<MultipartMemoryStreamProvider> multiPartTask = returnContent.ReadAsMultipartAsync();
MultipartMemoryStreamProvider mpmsProvider = multiPartTask.Result; <*** ERROR OCCURS HERE ***>

Stream multipartStream = mpmsProvider.GetStream(returnContent, returnContent.Headers);

【问题讨论】:

根据文件名,完全相同的字节数失败和代码中的其他一些命中,我很确定你和我正在使用相同的服务:) 我有无数其他人中的相同问题:/ 【参考方案1】:

您应该首先将您的浏览器指向服务,看看您是否可以先在浏览器上查看 wsdl。

http://YourLinuxBox:8080/SomeService.wsdl

此外,该服务托管在哪个应用程序服务器下?雄猫?老板?比如tomcat,在logs文件夹下"catalina.out"失败,看看服务是否加载正常。

这里有一篇文章特别为不熟悉 linux 的 dotnet 开发人员展示了如何在 Tomcat/Linux 上设置 Java-ws,并从 C# 中使用 Java-ws:

https://gridwizard.wordpress.com/2014/12/26/java-ws-and-dotnet-interop-example/ https://gridwizard.wordpress.com/2014/12/28/install-tomcat-on-fedora-vm-for-msdev/

【讨论】:

抱歉,我以为这就是你的问题。【参考方案2】:

您正在使用两个扩展名为“.jpg”的图像,并且您正在使用image/jpeg 中的Content-Type。基于此 SO answer,MIME 类型 image/jpgimage/jpeg 并不相同。因此,您可能想尝试将图像的 Content-Type 更改为 image/jpg,如下所示:

Content-Type: multipart/form-data; boundary=---------------------------MultiPartFormControl7d2fb2f20039a

Servlet-Engine: Tomcat Web Server/3.2.3 (JSP 1.1; Servlet 2.2; Java 1.4.2_11; Linux 2.6.18-371.8.1.el5 i386; java.vendor=Sun Microsystems Inc.)

-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307234.xml" filename="806307234.xml"
Content-Type: application/octet-stream

<*XML contents go here*>    
-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307873.jpg" filename="806307873.jpg"
Content-Type: image/jpg

<*binary data goes here*>    
-----------------------------MultiPartFormControl7d2fb2f20039a
Content-Disposition: form-data; name="806307876.jpg" filename="806307876.jpg"
Content-Type: image/jpg

<*binary data goes her**>    
-----------------------------MultiPartFormControl7d2fb2f20039a

【讨论】:

以上是关于C# 使用 Web API 使用 Java Web 服务(没有可用的 WSDL)的主要内容,如果未能解决你的问题,请参考以下文章

在没有 Java EE 应用服务器的情况下使用 Web 服务在 C# 和 Java 之间进行互操作?

使用 angular js 和 c# 使用 web api

如何在 C# 中使用 HttpClient 读取 Web api 响应

为啥我的 web api 在 C# 中使用 https 而不是 http

使用 C# Web Api 和 axios 进行令牌认证

使用xpath web api c#从xml获取数据