使服务端用axis2生成成代理调WCF报请求实体过大

博客分类:
我算是个AXIS2的初学者,以前用它来调用.net环境下的ws,几乎每遇到困难。用工具一路生成(XMLBeans绑定),然后就在程序中直接调用,因此也没有对其作深入的了解。
最近项目需要调用WCF架构下发布的ws,很不顺利,走了很多弯路,现在稍微有了点头绪......
使用最新版本的axis2携带的工具根据wsdl生成java代码,生成步骤网上有很多介绍,很简单的,我用的是Intellij IDEA的插件,稍微配置下搞定了。
注意:axis2版本一定要1.2以上的,否则会出错,之前版本并不能很好的兼容soap1.2规范。尝试过XFire最新版本1.2.6,不过很可惜,生成不了代码,而其动态调用的方式对含有复杂数据类型的ws来说太繁琐了。
比较而言,AXIS2对ms产品的支持力度还是值得肯定的。
然后在测试程序中加入客户端代码调用。调用的代码就不写了,和原先的调用方法没什么两样。
运行时出现如下异常:
org.apache.axis2.AxisFault: Transport out has not been set
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:440)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:329)
at org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.java:294)
at movie.MovieManagerStub.GetMovieByID(MovieManagerStub.java:7294)
at movie.TestMovieClient.main(TestMovieClient.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
网上对这个异常描述很少,无奈之下,下载了axis2源代码手动跟踪......
终于发现问题:
在wsdl描述文件中有如下的xml语句
name="MovieManager"
name="MetadataExchangeTcpBinding_MovieManager" binding="i0:MetadataExchangeTcpBinding_MovieManager"
location="net.tcp://10.0.0.249:8002/BusinessPlatform/MovieManager"
net.tcp://10.0.0.249:8000/BusinessPlatform/MovieManager
就是"net.tcp://"这段,axis2对net.tcp这个传输方式不能辨识。
axis2的kernal包中的org\apache\axis2\deployment\axis2_default.xml文件对支持的传输方式作了配置:
name="http"
class="org.apache.axis2.transport.http.SimpleHTTPServer"
name="port" locked="false"6060
name="tcp"
class="org.apache.axis2.transport.tcp.TCPServer"
name="port" locked="false"6061
name="jms"
class="org.apache.axis2.transport.jms.JMSSender"
name="tcp"
class="org.apache.axis2.transport.tcp.TCPTransportSender"
name="local"
class="org.apache.axis2.transport.local.LocalTransportSender"
name="http"
class="org.apache.axis2.monsHTTPTransportSender"
name="PROTOCOL" locked="false"HTTP/1.1
name="Transfer-Encoding" locked="false"chunked
name="https"
class="org.apache.axis2.monsHTTPTransportSender"
name="PROTOCOL" locked="false"HTTP/1.1
name="Transfer-Encoding" locked="false"chunked
核心 程序会根据这个配置来获得TransportSender这样的一个实例用于数据传输。
如果想要支持"net.tcp",可能需要扩展这个配置文件,甚至于需要自己去编写sender类。
对于wcf不是很了解,不知道"net.tcp"是否很换成其他协议,我需要和对方技术人员沟通下,看有无其他的解决方法。
在对方调整后,wsdl描述中不再出现"net.tcp"之类ms特有的通讯协议,生成和调用顺利通过。
---by waterdh
浏览: 78097 次
来自: 上海
谢谢,终于看懂了,看了半天了,我可以这么理解么,lock锁里面 ...
623deyingxiong 写道请问,比如说我在程序中第一次 ...
请问,比如说我在程序中第一次new 一个类的实例时,这个类的C ...
小子还不错!
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'本帖子已过去太久远了,不再提供回复功能。本帖子已过去太久远了,不再提供回复功能。wcf生成代理类(SVCUtil.exe的用法) - CSDN博客
wcf生成代理类(SVCUtil.exe的用法)
WCF中可以使用SVCUtil.exe生成客户端代理类和配置文件
&&&&&&& 1.找到如下地址“C:\Windows\System32\cmd.exe”& 命令行工具,右键以管理员身份运行(视系统是否为win7 而定)&
&&&&&&& 2.输入如下命令:
C:\&cd&C:\Program&Files\Microsoft&SDKs\Windows\v7.0A\bin
C:\Program&Files\Microsoft&SDKs\Windows\v7.0A\bin&SvcUtil.exe&/out:clientCode.cs
&/config:\app.config&http://localhost:62026/CalculatorService.svc
&&&&&&&&&说明:
&&&&&&&&&&&&& 参数:& “C:\ClientCode.cs ”&& ,是指生成的代理类输出存放到的地址
&&&&&&&&&&&&& 参数:& “C:\app.config ”&& ,是指存放到调用WCF服务程序目录下的配置文件的输出存放地址
&&&&&&&&&&&&& 参数:& “http://localhost:81/WCFServiceTest/CNPatentSearchService.svc”&& ,是指部署到IIS 的WCF服务的地址
&&&&&&&&&&&&&&
&&&&&&&&&&& 3.运行以上命令后,会在&C:\&目录下生成两个文件,ClientCode.cs& 和app.config
&&&&&&&&& (C:\app.config 中已经为我们配置好了WCF服务的根节点等必须的信息,当然,如果您也可以自己对部分参数进行修改)
备注:/out:clientCode.cs&/config:\app.config 俩文件之间是有空格的
本文已收录于以下专栏:
相关文章推荐
补充:以下命令为客户端生成代理svcutil net.tcp://192.168.0.100:3333/ChatService /language:C# /out:proxy.cs /config:a...
本文将演示如何通过自己手动编写代码来调用WCF服务。首先使用了ChannelFactory来创建通道,并调用与通道关联的服务协定。随后对代码进一步封装,选用从ClientBase类派生,可以更有效地简...
1.找到如下地址“C:\Windows\System32\cmd.exe”
命令行工具,右键以管理员身份运行(视系统是否为win7 而定)
2.输入如下命令:
最简单的用法:
第一个参数:language 语言
第二个参数:生成的配置文件
第三个参数config,配置文件名称
最后直接是提供wsdl的地址
/language:C#...
转自:/luowanli/archive//markeluo_wcfiis.html
开发工具:
Microsoft Vis...
WCF服务调用可以采用两个方法,由工具SvcUtil.exe生成本地代理服务类和配置文件方式,或者采用ChannelFactory直接创建服务代理对象。本文主要采用前面一种方式来进行。
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)下次自动登录
现在的位置:
& 综合 & 正文
使用T4 模板来自动生成WCF 代理类 代码
先看一下代码,下面这个代码是生成WCF代理类的一个模板,根据契约接口生成一个调用WCF的代理类。
vs 2012 新建一个 BaseDataProxyService.tt
文件,代码如下
&#@ template debug="false" hostspecific="false" language="C#" #&
&#@ assembly name="System.Core" #&
&#@ assembly name="$(ProjectDir)bin\debug\Quantum.PowerTMS5.ServiceHost.dll" #&
&#@ import namespace="System.Linq" #&
&#@ import namespace="System.Text" #&
&#@ import namespace="System.Collections.Generic" #&
&#@ import namespace="Quantum.PowerTMS5.ServiceHost" #&
&#@ import namespace="Quantum.PowerTMS5.Service" #&
&#@ output extension=".cs" #&
&#@ include file="..\..\Common.tt"#&
// ******************************************************
// This file was generated by the T4 engine and the
// contents of this source code will be changed after save t4 file
// create by gavin
// ******************************************************
using System.Collections.G
using System.L
using System.T
using Quantum.FrameWorkCore.WCFEx;
using System.ServiceM
using Quantum.FrameWorkCore.ExceptionEx;
using Quantum.ProxyService.AsynL
using Quantum.PowerTMS5.DTO;
using Quantum.PowerTMS5.ServiceH
using Quantum.PowerTMS5.S
using Quantum.FrameWorkCore.DynamicS
namespace Quantum.ProxyService.PowerTMS5.Configuration
public class BaseDataProxyService
public static BaseDataProxyService GetInstance()
return new BaseDataProxyService();
&#foreach (MethodInfo method in typeof(IService1).GetMethods()) {#&
public &#=GetMethodReturnType(method)#& &#=method.Name#&(&#=GetMethodParameterList(method)#&)
ServiceInfo&IService1& service = FindService.BasicHttpBinding&IService1&();
&#if(method.ReturnType != typeof(void)){#&return&#}#& service.t.&#=method.Name#&(&#=GetMethodParameterValueList(method)#&);
catch (FaultException&UserFriendlyError& ufe)
if (ufe.Detail.HintLevel == ExceptionLevel.Business)
AsynLogServiceProxy.GetInstance().WriteExceptionLogInfo(ufe, "");
throw new Exception("未知错误");
catch (Exception ex)
AsynLogServiceProxy.GetInstance().WriteExceptionLogInfo(ex, "");
throw new Exception("未知错误");
service.Close();
AsynLogServiceProxy.GetInstance().WriteOperationLogInfo("");
简单说下方法,如果开发过asp的人或者mvc的人人,应该对这种模式比较清楚。
先下载一个工具 t4 editor,这个工具有助于你编写模板,比如高亮关键字,自动收缩
安装完后,对下面几处做一个解释就明白了
output extension=".cs"
这个是指模板生成的文件后缀名,你可以随便写
&#@ assembly name="$(ProjectDir)bin\debug\Quantum.PowerTMS5.ServiceHost.dll" #&
&#@ import namespace="Quantum.PowerTMS5.ServiceHost #&
assembly 是加载程序集,比如你这个t4 模板要使用你自己写的一个dll,就得先加载进来,然后用import 引用进来,import 等于using的意思
可以使用 $(variableName) 语法引用 Visual Studio 或MSBuild变量(如 $(SolutionDir)),以及使用 %VariableName% 来引用环境变量。
常用的有:
$(ConfigurationName)
当前项目配置的名称(如“Debug”)。
$(PlatformName)
当前项目平台的名称(如“Win32”)。
$(ProjectName)
项目的基本名称。
$(TargetDir)
生成的主输出文件的目录(定义为驱动器 + 路径);包括尾部的反斜杠“\”。
$(TargetName)
生成的主输出文件的基本名称。
$(FrameworkDir)
安装 .NET Framework 的目录。
$(FrameworkVersion)
Visual Studio 使用的 .NET Framework 版本。
$(WebDeployPath)
从 Web 部署根到项目输出所属于的位置的相对路径。返回与RelativePath相同的值。
$(WebDeployRoot)
指向&localhost&位置的绝对路径。例如,c:\inetpub\wwwroot。
// ******************************************************
// This file was generated by the T4 engine and the
// contents of this source code will be changed after save t4 file
// create by gavin
// ******************************************************
using System.Collections.G
using System.L
using System.T
using Quantum.FrameWorkCore.WCFEx;
using System.ServiceM
using Quantum.FrameWorkCore.ExceptionEx;
using Quantum.ProxyService.AsynL
using Quantum.PowerTMS5.DTO;
using Quantum.PowerTMS5.ServiceH
using Quantum.PowerTMS5.S
using Quantum.FrameWorkCore.DynamicS
namespace Quantum.ProxyService.PowerTMS5.Configuration
这些东西就是原始输出了,你写什么,模板就照搬出来
&#foreach (MethodInfo method in typeof(IService1).GetMethods()) {#&
这个是循环控制块,循环输出代理方法
有三种类型的控制块,根据其左括号对它们进行区分:
&# 标准控制块 #&
可以包含语句。
&#= 表达式控制块 #&
将一个可以计算为字符串的表达式括起来,用于提供要写入“输出”文件的字符串的代码。
&#+ 类功能控制块 #&
可以使用类功能控制块向文本模板添加方法、属性、字段甚至是嵌套类。必须作为文件中的最后一个块显示,或者用&#@ include #&引入外部文件。
好了,你自己可以试试了,简单的入门,呵呵
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 服务端用axis2生成 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信