动态创建服务参考和使用服务

我想要做的是;我使用配置文件中的“WSDL”服务链接并以编程方式使用服务,并使用我将使用的方法的名称。动态创建服务参考和使用服务

的代码片段我使用静态运行如下,

ServiceName.serviceClientSoapClient= new ServiceName.serviceClientSoapClient(); 

string xmlStr = client.getValues();

和端点是,

<endpoint address="http://someservice.com/Service.asmx" 

binding="basicHttpBinding" bindingConfiguration="serviceClientSoap"

contract="ServiceName.serviceClientSoap" name="serviceClientSoap" />

但是,我想这一切的编程方式创建, 例如;我的配置文件,

<add key="serviceLink" value="http://someservice.com/Service.asmx"/> 

<add key="serviceClientClassName" value="serviceClientSoapClient"/>

<add key="serviceMethod" value="getValues"/>

然后我想使用这个配置文件,并使用服务,得到结果。

我看了下面的链接,但是这里是通过一个服务结构完成的。我希望它从配置文件安装。

How to programmatically connect a client to a WCF service? ,How to: Use the ChannelFactory

回答:

它可以更好地创建一个接口,并实现它的服务客户。通过这种方式,您应该指定配置文件中所需的方法,参数和其他内容,并且难以管理。另外,您不能将结果对象用作已知的类型类。

所以,你可以尝试这样的事情:

var url = ConfigurationManager.AppSettings["serviceLink"]; 

var serviceClientClassName = ConfigurationManager.AppSettings["serviceClientClassName"];

var serviceMethod = ConfigurationManager.AppSettings["serviceMethod"];

var endpoint = new EndpointAddress(new Uri(url));

//Specify the assembly of services library. I am assuming that the services are stored in the Executing Assembly

var serviceClient = Assembly.GetExecutingAssembly().GetTypes()

.FirstOrDefault(x => x.Name == serviceClientClassName);//Find the service client type

var instance = Activator.CreateInstance(serviceClient); //Create a new instance of type

var methodInfo = serviceClient.GetMethod(serviceMethod); //Get method info

var result = methodInfo.Invoke(instance, new object[] {}); // Invoke it

回答:

如果你需要的是WCF CommunicationObject的处理RequestReply端点,下面的方法会为你做的。

它需要一个有效的请求消息,端点和一个soapaction,并给出服务返回的原始xml。

如果您想给它其他任何东西然后Message您需要实现替代IRequestChannel用ServiceContract和OperationContract属性装饰。

// give it a valid request message, endpoint and soapaction 

static string CallService(string xml, string endpoint, string soapaction)

{

string result = String.Empty;

var binding = new BasicHttpBinding();

// create a factory for a given binding and endpoint

using (var client = new ChannelFactory<IRequestChannel>(binding, endpoint))

{

var anyChannel = client.CreateChannel(); // Implements IRequestChannel

// create a soap message

var req = Message.CreateMessage(

MessageVersion.Soap11,

soapaction,

XDocument.Parse(xml).CreateReader());

// invoke the service

var response = anyChannel.Request(req);

// assume we're OK

if (!response.IsFault)

{

// get the body content of the reply

var content = response.GetReaderAtBodyContents();

// convert to string

var xdoc = XDocument.Load(content.ReadSubtree());

result = xdoc.ToString();

}

else

{

//throw or handle

throw new Exception("panic");

}

}

return result;

}

要使用上面的方法,你可以从配置文件中获取两个参数,或使用一些常数值:

var result = CallService(

@"<GetData xmlns=""http://tempuri.org/""><value>42</value></GetData>",

ConfigurationManager.AppSettings["serviceLink"],

ConfigurationManager.AppSettings["serviceSoapAction"]);

// example without using appSettings

var result2 = CallService(

@"<GetValues xmlns=""http://tempuri.org/""></GetValues>",

"http://localhost:58642/service.svc",

"http://tempuri.org/IService/GetValues");

请注意,您将不再需要在你的配置文件中的任何其他配置超越:

<appSettings> 

<add key="serviceLink" value="http://localhost:58642/service.svc"/>

<add key="serviceSoapAction" value="http://tempuri.org/IService/GetData"/>

</appSettings>

使用服务的WSDL找出的SOAPAction:

<wsdl:binding name="BasicHttpBinding_IService" type="tns:IService"> 

<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="GetData">

<soap:operation soapAction="http://tempuri.org/IService/GetData" style="document"/>

,并按照通过其端口类型和消息它的路线,你会发现类型:

<wsdl:types> 

<xs:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:import namespace="http://schemas.datacontract.org/2004/07/"/>

<xs:element name="GetData">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" name="value" type="xs:int"/>

</xs:sequence>

</xs:complexType>

</xs:element>

,从中可以构建XML负载的形状的GetData:

<GetData xmlns="http://tempuri.org/"> 

<value>42</value>

</GetData>

以上是 动态创建服务参考和使用服务 的全部内容, 来源链接: utcz.com/qa/261782.html

回到顶部