- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Apache Camel 访问 Web 服务,但在调用 .NET Web 服务时遇到了奇怪的问题。
这是Camel发送的POST请求:
ID: 1
Address: http://<domainName>/<pathToService>.asmx
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], breadcrumbId=[ID-someId-1449849054155-0-1], SOAPAction=["http://<someNamespace>/<SoapActionName>"]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>/soap:Body></soap:Envelope>
这就是响应:
ID: 1
Response-Code: 302
Encoding: UTF-8
Content-Type: text/html; charset=utf-8
Headers: {Cache-Control=[private], Content-Length=[223], content-type=[text/html; charset=utf-8], Location=[/<somePath>/CustomError.htm?aspxerrorpath=/<pathToService>.asmx], Persistent-Auth=[true], Server=[Microsoft-IIS/7.5], X-AspNet-Version=[4.0.30319], X-Powered-By=[ASP.NET], X-UA-Compatible=[IE=7]}
Payload: <html><head><title>Object moved</title></head></html>
当我在浏览器中请求“http://domainName/pathToService”时,我看到了正确的答案。
当我请求“http://domainName/pathToService.asmx?wsdl”时,我将获取 wsdl 文件。
如果我将 SoapActionName 更改为不正确的值,我会得到
"java.lang.IllegalArgumentException: Can't find the BindingOperationInfo with operation name ..."
当然,这也是正确的行为。
我认为我需要调整 Camel 以使其能够与 .NET Web 服务一起使用。
但是如何呢?
Camel 配置(全部在 Spring DSL 中):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://camel.apache.org/schema/cxf"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:sec="http://cxf.apache.org/configuration/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="exceptionHandler" class="...ExceptionHandler"/>
<cxf:cxfEndpoint id="wsEndpoint"
address="${ws.host}/service.asmx"
serviceClass="pathToServiceClass"
loggingFeatureEnabled="true"
endpointName="endpointName">
<cxf:outInterceptors>
<ref bean="loggingOutInterceptor"/>
</cxf:outInterceptors>
<cxf:inInterceptors>
<ref bean="loggingInInterceptor"/>
</cxf:inInterceptors>
<cxf:properties>
<entry key="dataFormat" value="POJO"/>
</cxf:properties>
</cxf:cxfEndpoint>
<http:conduit name="{serviceClass}endpointName.http-conduit">
<http:authorization>
<sec:UserName>domain\username</sec:UserName>
<sec:Password>password</sec:Password>
<sec:AuthorizationType>NTLM</sec:AuthorizationType>
</http:authorization>
</http:conduit>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route id="mainRoute">
<from uri="file://inbox"/>
<setHeader headerName="operationName">
<constant>AcquireTicket</constant>
</setHeader>
<to uri="cxf:bean:wsEndpoint" pattern="InOut"/>
<onException>
<exception>java.lang.Exception</exception>
<process ref="exceptionHandler"/>
</onException>
<to uri="log:mylog?Level=INFO"/>
</route>
</camelContext>
我使用 JUnit 调用 Camel:
@Test
public void testWebservice() throws Exception {
...
forming request
...
context.getRouteDefinition("mainRoute")
.adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith("direct:in");
}
});
context.start();
ProducerTemplate template = context.createProducerTemplate();
template.sendBody("direct:in",request);
}
我尝试在没有 Camel 的情况下使用 Apache HttpClient 的请求 Web 服务:
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getAuthSchemes().register(AuthPolicy.NTLM,new JCIFSNTLMSchemeFactory());
httpClient.getAuthSchemes().register(AuthPolicy.SPNEGO,new JCIFSNTLMSchemeFactory());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
NTCredentials ntCredentials = new NTCredentials(USERNAME, PASSWORD,
InetAddress.getLocalHost().getHostName(), DOMAIN);
HttpHost target = new HttpHost(HOST,80,"http");
credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort(),
AuthScope.ANY_REALM, "NTLM"), ntCredentials);
httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, ntCredentials);
HttpPost post = new HttpPost(URL);
post.addHeader("SOAPAction", SOAP_ACTION);
post.addHeader("Content-Type",CONTENT_TYPE);
post.addHeader("Accept-Encoding",ACCEPT_ENCODING);
HttpEntity httpEntity = new StringEntity(getShortText());
post.setEntity(httpEntity);
HttpResponse response = httpClient.execute(post);
这是 Camel 创建的最后一个 POST 请求(3 个 NTLM 请求中的 3 个):
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache CXF 3.1.4
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8013
Connection: keep-alive
Content-Length: 269
Authorization: NTLM <Token>
Apache HttpClient 使用上述代码创建了最后一个(3 个 NTLM 请求中的 3 个)POST 请求:
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept-Encoding: gzip,deflate
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Host: localhost:8013
Connection: Keep-Alive
Content-Length: 269
Authorization: NTLM <Token>
这两个请求看起来与我相同,但 IIS 对 Camel 请求的响应是 HTTP 302,IIS 对 Apache HttpCLient 的响应是 HTTP 200。
主机是 localhost:8013 因为我使用监听器来分析 HTTP 流量,该监听器将所有请求转发到远程服务器。
最佳答案
因为您的浏览器可以遵循位置 header 的 302 重定向。
您得到的响应是 HTTP 302,它是基于位置 header 的重定向。所以你需要告诉Camel跟随302并从location header中获取URI。
关于java - 使用 Apache Camel 访问正确的 URL 时出现响应代码 302,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34228294/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!