[.NET Remoting] Zelf een proxy schrijven

Pagina: 1
Acties:

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Ik zit nu al een tijdje te kl#ten om zelf een proxy dll te maken voor een .NET Remoting webservice. Ik heb op dit moment een Webservice als dll file draaien onder IIS. Nu zoek ik een tutorial (of tips) om hier een goede basiskennis van te krijgen. Iemand die me hiermee kan helpen?

Op: http://www.dotnetextreme.com/articles/remoting.asp staat een tutorial maar daar wordt de proxy door de .NET util soapsuds.exe gemaakt en dat wil ik niet. Ik wil 'm zelf schrijven zodat ik een beter inzicht heb in het hele .NET proxy verhaal.

Situatie:
client.exe <-> proxy.dll <--> internet <--> proxy.dll <-> Webservice.dll

  • daansan
  • Registratie: Maart 2000
  • Laatst online: 01-09 19:57
Dat lijkt mij ook zeer interessant om te weten.
Ik ben zelf al even in de weer geweest met remoting in .NET

Maar ik heb ook nog geen informatie kunnen vinden over het zelf bouwen van proxies en stubs in .NET.

Informatie over het bouwen van proxies en stubs voor COM (in VS 6) was ook schaars.

Als iemand hier meer van weet ben ik zeer geïnteresseerd.

I love it when a plan comes together!


Verwijderd

Informatie over het bouwen van proxies en stubs voor COM (in VS 6) was ook schaars.
Zover ik weet staat dit slechts in 2 boeken beschreven "inside OLE" (schrijver / complete titel weet ik zo uit m'n hoofd niet) en Com essentials van Don box, ik heb me er nooit zo heel erg mee bezig gehouden en altijd de door midl gegenereerde proxy's gebruikt..

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik heb wel met .NET Remoting gewerkt, maar nog nooit zelf proxies geschreven.

Ik heb de indruk dat de informatie hier ook nogal schaars is. Wel weet ik dat Advanced .NET Remoting een erg goed startpunt is van een diepgaande kennismaking met .NET Remoting. Het schijnt een erg goed boek te zijn. Het sample chapter wat je kan downloaden is sowieso al erg aardig :) .

Op de website (in de FAQ) vind je ook iets over het schrijven van eigen proxies, maar die info schijnt niet meer helemaal up-to-date te zijn. Ik heb het boek zelf helaas nog niet, dus ik kan niet voor je nagaan of er echt iets zinnigs in staat op dit punt.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 27-08 08:10
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using BasicServer;

    /// <summary>
    /// Custom Proxy Class.
    /// </summary>
public class MyRealProxy : RealProxy 
{
    Type myType;

    public MyRealProxy(Type type) : base(type) 
    {
        myType = type;
    }

    public override IMessage Invoke(IMessage msg) 
    {
        Console.WriteLine("IMessage Properties:\n");
        IDictionary myProps = msg.Properties;

        foreach (object key in myProps.Keys)
        {
            Console.WriteLine("  Key: {0}\n      Value: {1}",
              key.ToString(), myProps[key]);
        }
        MarshalByRefObject myObject = 
         (MarshalByRefObject)Activator.CreateInstance(myType);

        ObjRef myRef = RemotingServices.Marshal(myObject);

        msg.Properties["__Uri"] = myRef.URI;
        IMessage returnMsg = 
            ChannelServices.SyncDispatchMessage(msg);

        return returnMsg;
    }
}

    /// <summary>
    /// Remoting Proxy Client.
    /// </summary>
class RemotingProxyClient
{
    static void Main(string[] args)
    {
        Type   type = typeof(BasicRemotingServer);

        RemotingConfiguration.Configure(
            "RemotingProxyClient.exe.config");

        MyRealProxy myProxy = new MyRealProxy(type);
        BasicRemotingServer brs = 
          (BasicRemotingServer)myProxy.GetTransparentProxy();

        Console.WriteLine("\nServer Response: {0}", 
            brs.getServerResponse());

        Console.ReadLine();
    }
}

http://www.sams.com/content/images/067232122X/downloads/code.zip

Koop het boek C# Unleashed van Joseph Mayo!

[edit]
ff config bestandje ;)
code:
1
2
3
4
5
6
7
8
9
<configuration>
    <system.runtime.remoting>
        <application name="RemotingProxyClient">
            <channels>
                <channel type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting" />
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Is gelukt :) Ik ben aan de gang gegaan met Interfaces. Dat is volgens mij aardig gelukt. zit het nu een beetje te testen.

HelloProxy.dll
code:
1
2
3
4
5
6
7
8
9
using System;

namespace HelloInterface
{
    public interface IHello
    {
        String GetHello();
    }
}

En de server krijgt onder andere de volgende dll:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using HelloInterface;

namespace HelloServer
{
    public class Hello : System.Runtime.Remoting.Services.RemotingService, IHello
    {
        public Hello () {}

        public String GetHello()
        {
            return "Hello!!";
        }
    }
}

De client ziet er als volgt uit (exe file)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using HelloInterface;

namespace HelloClient
{
    class HelloClient
    {
        static void Main(string[] args) 
        {           
            ChannelServices.RegisterChannel(new HttpClientChannel());
            IHello helloService =(IHello)Activator.GetObject(
                typeof(IHello),
                "http://localhost/Hello2/Hello.soap");

            Console.WriteLine("HelloServer Called:"+ helloService.GetHello());
            Console.WriteLine("Press any key to continue...");
            Console.Read();
        }
    }
}

De rest is een beetje spelen met IIS en de .exe.config file voor de server. Hmm, de client zou trouwens ook met een .exe.config file moeten kunnen werken. Weer wat te doen :p

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Op donderdag 18 juli 2002 16:37 schreef skiwi het volgende:
Hmm, de client zou trouwens ook met een .exe.config file moeten kunnen werken.
Nou, dat valt nog niet mee om dat voor elkaar te krijgen. Ik heb dit nu in de client staan:
code:
1
2
3
4
RemotingConfiguration.Configure(&quot;SimpleInterfaceClient.exe.config&quot;);
Hello obj = new Hello();
Console.WriteLine(&quot;HelloServer Called:&quot;+ obj.GetHello());
Console.Read();

Nu geeft de compiler een error op:
code:
1
Hello obj = new Hello();

"The type or namespace name 'Hello' could not be found"

Tja, op zich logisch: de client gebruikt alleen de proxy dll file als reference en daar staat de class Hello inderdaad niet in. Daar staat alleen maar een interface in gedefinieerd (zie bovenstaande bericht). Vraag is nu: hoe maak ik de client duidelijk waar hij de functie GetHello() kan vinden?? Ik heb net even de server dll file als reference toegevoegd aan de client en dan herkent hij 'm (natuurlijk) wel maar ja, dan is het geen webservice meer. De webserver wordt dan gewoon mee ge-include in de client. Iemand een idee?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je niet gewoon visual studio zelf een stub laten maken en daar dan een beetje in kijken hoe het ongeveer werkt? want visual studio genereert ook gewoon de source code zodat je die gewoon kan lezen

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Op vrijdag 19 juli 2002 11:04 schreef rwb het volgende:
Kan je niet gewoon visual studio zelf een stub laten maken en daar dan een beetje in kijken hoe het ongeveer werkt? want visual studio genereert ook gewoon de source code zodat je die gewoon kan lezen
Je bedoelt dat ik het hele interface gebeuren moet vergeten? Dat is voor mij geen optie (helaas). Het moet met reeds bestaande webservices gaan communiceren die al gebruik maken van interfaces. Daar kan ik niks aan veranderen.
Pagina: 1