安装程序
我有一个WCF服务,它暴露了一个基类型(例如Animal)以及一些派生类型(例如Lion,Tiger和Bear).另一种类型(例如,Zoo)包括属性,该属性是基类型的集合.基类型是具体的,而不是抽象的,因此集合包含基类型和/或派生类型(以任意组合)的实例是完全可以接受的.例如:
[DataContract, KnownType(typeof(Lion)),
KnownType(typeof(Tiger)), KnownType(typeof(Bear))]
public class Animal
{
[DataMember]
public string Species { get; set; }
}
[DataContract]
public class Lion : Animal { }
[DataContract]
public class Tiger : Animal { }
[DataContract]
public class Bear : Animal { }
[DataContract]
public class Zoo
{
[DataMember]
public List<Animal> Animals { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的一个服务操作接受此类型作为其参数,如下所示:
[ServiceContract]
public interface IZooService
{
[OperationContract]
void SetZoo(Zoo zoo);
}
Run Code Online (Sandbox Code Playgroud)
所有这些都很好,并且发出的WSDL对我来说看起来非常好.它包含所有类型,并正确指示派生类型从基类型继承.所以,我应该能够使用SOAP消息调用我的服务,如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:z="http://zoo.org">
<soapenv:Header/>
<soapenv:Body>
<z:SetZoo>
<z:Zoo>
<z:Animals>
<z:Animal> …Run Code Online (Sandbox Code Playgroud) 我有一个服务器(SoapUI)回答WSDL的请求.
发送测试请求时,我的服务器代码正在接收一个参数列表,但我试图实现的是一个复杂类型的单个参数,例如:
{
ingredient_id => INT
something => STRING
...
}
Run Code Online (Sandbox Code Playgroud)
我的类型如下:
<wsdl:types>
<xsd:schema targetNamespace="/ingredient">
<xsd:element name="getIngredientInfo" type="tns:IngredientRequest"></xsd:element>
<xsd:element name="getIngredientInfoResponse" type="tns:ingredient"></xsd:element>
<xsd:complexType name="ingredient">
<xsd:sequence>
<xsd:element name="ingredient_id" type="xsd:int" minOccurs="1" maxOccurs="1"></xsd:element>
<xsd:element name="ingredient_name" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
<xsd:element name="status_gm" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
<xsd:element name="status_vegan" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
<xsd:element name="status_vegetarian" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
<xsd:element name="author_id" type="xsd:int" block="#all" minOccurs="1" maxOccurs="1"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="IngredientRequest">
<xsd:sequence>
<xsd:element name="ingredient_id" type="xsd:int"></xsd:element>
<xsd:element name="something" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解为什么WSDL使SoapUI将参数作为简单参数列表而不是单个复杂参数发送?
编辑:这可能是序列标签的一些问题,但我找不到问题,只需要一些亮点.提前致谢!
当然,我就在这里:
<?xml …Run Code Online (Sandbox Code Playgroud) 当我导航到WCF svc页面https://mywebstie.project.com/myproject/myuploadservice.svc时,我按预期命中了svc,但是它提供的svcutil URL使用了实际的服务器名称;例如,而不是mywebsite.project.com URL。
当我按所提供的指向WSDL文件的链接时,浏览器中仅呈现文本https://mywebstie.project.com/myproject/myuploadservice.svc/SQLMembershipProvider。浏览器中的URL实际上是使用服务器名称而不是mywebstie.project.com。
WSDL XML的内容未呈现。
可能是什么问题?我没有更改客户端或服务器的配置,但是我的服务无法正常工作。
收到对https://mywebstie.project.com/myproject/myuploadservice.svc/SqlMembershipProvider的HTTP响应时发生错误。这可能是由于服务端点绑定未使用HTTP协议。这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。有关更多详细信息,请参见服务器日志。
这是我的服务器配置
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MembershipBehaviour">
<serviceMetadata httpsGetEnabled="true" />
<serviceCredentials>
<serviceCertificate findValue="44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44"
storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="SqlMembershipProvider" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="SqlMembershipProvider">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
<mexHttpsBinding>
<binding name="mex" />
</mexHttpsBinding>
</bindings>
<services>
<service behaviorConfiguration="MembershipBehaviour" name="Test.Web.Services.MyUploadService"> …Run Code Online (Sandbox Code Playgroud) 我有一个WCF服务.我是从另一个部门的xsd文件构建的.它生成的只是类,我修改它以匹配我们的"标准".我需要看看该函数的wsdl是否与xsd匹配,实际上其中一个输入的wsdl与它们给我们的匹配.
http://localhost:26535/EDeliveryOrderSvc.svc?wsdl
Run Code Online (Sandbox Code Playgroud)
显示整个服务的wsdl.我的功能部分:
<wsdl:operation name="CreateOrUpdateOSSOrdersFromEntityInput">
<soap:operation soapAction="http://[redacted]/EDeliveryOrderSvc/CreateOrUpdateOSSOrdersFromEntityInput" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
Run Code Online (Sandbox Code Playgroud)
没有告诉我有关输入参数的任何信息.我错过了一些简单的事吗?
我之前使用过SOAP,但很多年前,如果我能帮助它,我会尽量保持清醒.
短篇故事...
client.request :foo_web_serivce, :language_count, :body => { :foo_app_id => "...", :session_id => "..." }然后我得到一个,Status 200但我的结果是-1因为我认为app_id无法识别.<LanguageCount>)而不是Savon的call(<foo_web_service:LanguageCount>),那么我得到一个Status 500.请提前告知并提前致谢.
很长的故事...
使用SOAP客户端我可以看到正确的请求XML是:
User-Agent: Mac OS X; WebServicesCore (357)
Content-Type: text/xml
Host: redacted
Soapaction: http://tempuri.org/redacted/LanguageCount
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<LanguageCount xmlns="http://tempuri.org/">
<fooAppID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</fooAppID>
<sessionID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</sessionID>
</LanguageCount>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在控制台中这样做时:
ruby-1.8.7-p302 > client = Savon::Client.new do |wsdl, http, wsse|
ruby-1.8.7-p302 …Run Code Online (Sandbox Code Playgroud) 我已经向已经使用了大量SOAP请求的现有项目添加了一个新的SOAP请求.他们都很好.我以完全相同的方式添加我的新代码(通过Apache CXF从WSDL生成的代码),但不知何故它失败了.
我收到此错误:
javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info for web method foo.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:113)
at $Proxy51.foo(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
这是一个Grails项目,代码调用如下:
FooRequest request = new FooRequest()
processResponse(order) { getPort().foo(request) }
Run Code Online (Sandbox Code Playgroud)
它是底部的getPort().foo(),显然是失败的.事实上,我认为不是调用失败,而是闭包的创建,因为processResponse()似乎没有被执行(我在该方法的第一行放了一个println). 编辑:这是关闭的执行失败,而不是创建.所以它真的找不到getPort().foo(),尽管我生成的接口确实有这个方法:
public nl.wecompany.portal.webserviceQopi.QOPIResponse foo(
@WebParam(name = "in", targetNamespace = "")
com.myproject.FooRequest in
);
Run Code Online (Sandbox Code Playgroud)
getPort()返回一个org.apache.cxf.jaxws.JaxWsClientProxy@41079622,它也可以用于其他SOAP请求(有效的请求).
我在新代码和现有代码之间找不到任何有意义的区别.什么想法可能是错的?关于在哪里看的任何建议?
编辑:port.metaClass.methods*.name.sort().unique()包含我的新foo()方法.然而,当我调用它时,我得到了这个奇怪的wsdl:binding错误,并且该方法没有被执行(它没有到达第一行的println).
编辑:匿名化我打算匿名的一些东西.
我正在尝试使用以下PHP代码建立SOAP连接,并且它在SoapClient构造点处失败:
// Need to declare these settings here because our php.ini has alternate
// settings due to global purposes for other PHP scripts
ini_set("soap.wsdl_cache_enabled", "0");
ini_set("soap.wsdl_cache", "0");
ini_set("display_errors","On");
ini_set("track_errors","On");
// FedEx web services URL, note the HTTPS
$path_to_wsdl = 'https://wsbeta.fedex.com/web-services';
$soap_args = array(
'exceptions'=>true,
'cache_wsdl'=>WSDL_CACHE_NONE,
'trace'=>1)
;
try {
$client = new SoapClient($path_to_wsdl,$soap_args);
} catch (SoapFault $e) {
var_dump(libxml_get_last_error());
echo "<BR><BR>";
var_dump($e);
}
Run Code Online (Sandbox Code Playgroud)
这输出:
object(LibXMLError)#1 (6) {
["level"]=> int(1)
["code"]=> int(1549)
["column"]=> int(0)
["message"]=> string(71) "failed to load external entity …Run Code Online (Sandbox Code Playgroud) 如何访问wsdl URL SOAPUI,其中需要用户名/密码?
http://localhost:8080/ws/hello1?wsdl
我之前从未遇到类似的问题,
我尝试使用SOAP 4.0.1以及SOAP 5.1.2.我在Windows上尝试了它,但在Windows Server 2008上我尝试导入WSDL:提供了NT身份验证对话框: 指定NT身份验证凭据 以填充用户名,密码,域
我能够在Firefox中打开WSDL定义:
http://192.168.0.242/SO/Services/ScheduleService.svc?wsdl
Run Code Online (Sandbox Code Playgroud)
输入用户名和密码后
但在尝试导入WSDL文件或尝试使用位置URL导入wsdl文件时
Error loading WSDL
There was something wrong with the WSDL you are trying to import
Error loading
[http://192.168.0.242/SO/Services/ScheduleService.svc?wsdl=wsdl0]: org.apache.xmlbeans.XmlException:
org.apache.xmlbeans.XmlException: error: Reference to undefined entity: raquo
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用node-soap来使用SOAP api.我刚刚运行了一些localhost测试.
这是我的wsdl:http://hastebin.com/orenizosay.xml
这是我的XSD(来自WSDL):http://hastebin.com/zaqogicabo.xml
public class InsulinEndpoint {
public static void main(String[] argv) {
Insulin insulin = new Insulin ();
String address = "http://localhost:8081/insulin/";
Endpoint.publish(address, insulin);
System.out.println("Webservices online at: " + address);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的节点测试应用程序.客户端已成功创建,client.describe()正确显示方法.
soap.createClient(url, function(err, client) {
if (err) throw err;
client.backgroundInsulinDose({arg0: 10}, function(err, result) {
if(err)
console.error(err);
else
console.log(result);
});
});
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用backgroundInsulinDose时,我的回答是
<faultstring>Cannot find dispatch method for {}backgroundInsulinDose</faultstring>
Run Code Online (Sandbox Code Playgroud)
而且我的node-soap发送的XML消息是
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:tns="http://server/"><soap:Body><backgroundInsulinDose><arg0>10</arg0></backgroundInsulinDose></soap:Body></soap:Envelope>--------------------
Run Code Online (Sandbox Code Playgroud) wsdl ×10
soap ×6
wcf ×3
web-services ×3
soapui ×2
binding ×1
collections ×1
cxf ×1
endpoint ×1
grails ×1
inheritance ×1
java ×1
jax-ws ×1
node.js ×1
php ×1
ruby ×1
savon ×1
soap-client ×1
xml ×1
xsd ×1