开发者

Consume a Java Web Service through a C# Service Reference

There are many questions about how to do this using a Web Reference in C#, but I know how to do that. What I'm trying to accomplish is to have a portable dll that consumes the Java Web Services that I can reference in my projects instead of duplicating the functionality. One of the things is that with Web References the KeepAlive of the request is se开发者_开发知识库t to true. That doesn't work for the environment I'm developing in and it has to be false. What I did with Web References is create an abstract class that inherits SoapHttpClientProtocol and change the Reference.cs to inherit from the abstract class. The abstract class looked like this:

[System.Web.Services.WebServiceBinding(Name = "JavaWebReferenceProxy")]
public abstract class JavaWebReferenceProxy : SoapHttpClientProtocol
{
    public JavaWebReferenceProxy()
    {
        base.Timeout = Settings.Instance.SoapTimeout;
    }

    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest rq = base.GetWebRequest(uri);
        ((HttpWebRequest)rq).KeepAlive = Settings.Instance.SoapKeepAlive;

        return rq;
    }
}

This allowed me to override the GetWebRequest and the constructor to set values that were in the web.config. I'm wondering how I can do this with a Service Reference to the Java Web Service. I've found some examples for the simplified serviceModel section in 4.0 (which is the framework I'm using), but I need to specify the url and the timeout as well. I'm not sure if I can use the simplified serviceModel or if I need to use the full implementation. I also am unsure if I can use the Service Reference at all. I'm just looking for a little guidance if anyone has implemented something like this.

What should the serviceModel section look like in my config file? The 3 things I need to be able to specify is the URL, the Timeout and the keep-alive. Thanks in advance.


You need custom binding for that. Try this:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="myBinding" sendTimout="00:05:00">
        <textMessageEncoding messageVersion="Soap11" />
        <httpTransport keepAliveEnabled="false" />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint name="myEndpointName" address="http://..." binding="customBinding" 
              bindingConfiguration="myBinding" contract="MyReference.IMyService" />
  </client>
</system.serviceModel>

SendTimeout should set timeout for operation completion (including receiving response), keepAliveEnebled controls persistent HTTP connection and address in edpoint is address of the service.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜