2013-11-04 11 views
11

mam następujący kod:Jak programowo utworzyć BasicHttpBinding?

BasicHttpBinding binding = new BasicHttpBinding(); 

Uri baseAddress = new Uri ("URL.svc"); 

EndpointAddress endpointAddress = new EndpointAddress (baseAddress); 

var myChannelFactory = new ChannelFactory<IMyInterface> (binding, endpointAddress); 

IMyInterface client = null; 

try 
{ 
    client = myChannelFactory.CreateChannel(); 
    var a = client.WsFunction ("XXXXXX");      
    ((ICommunicationObject)client).Close(); 
} 
catch 
{ 
    if (client != null) 
    { 
     ((ICommunicationObject)client).Abort(); 
    } 
} 

Gdzie "IMyInterface" jest interfejs, który implementuje mój WS .. na przykład:

[ServiceContract] 
public interface IMyInterface 
{ 
    [OperationContract] 
    Result WsFunction1 (string param); 

    [OperationContract] 
    Result WsFunction2 (string param); 

    [OperationContract] 
    Result WsFunction3 (string param); 
} 

I zwraca coś takiego:

[DataContract] 
public class Result 
{ 
    string a = ""; 
    string b = ""; 

    [DataMember] 
    public string A 
    { 
     get { return a; } 
     set { a = value; } 
    } 

    [DataMember] 
    public string B 
    { 
     get { return b; } 
     set { b = value; } 
    } 
} 

Po uruchomieniu tego kodu mogę dotrzeć do WS, ale nigdy nie mogę uzyskać wyniku wypełnionego.

Co robię źle?

Z góry dziękuję!

+0

To by się nie skomplikowało, mały a jest typu ciąg, a duży jest typu bool. –

+0

To dlatego, że zmieniłem nazwy ... ale w rzeczywistości to się kompiluje i WS odbiera komunikat ... ale nie mogę uzyskać wyniku. – Crasher

+0

Przestrzeń nazw wyników jest jednym z probaleńskich sprawców, ale zacznę od wąchania ruchu http debugger. –

Odpowiedz

8

Najprostszym sposobem uzyskania dostępu do usługi poprzez BasicHttpBinding jest wygenerowanie kodu klienta z SlSvcUtil.exe, który jest aplikacją użytkową silverlight.

SLsvcUtil.exe /directory:C:\users\me\Desktop http://URL.svc 

To powinno utworzyć klasę MyInterfaceClient wewnątrz generowanego pliku.

Następnie w kodzie można zrobić:

var binding = new BasicHttpBinding() { 
    Name = "BindingName", 
    MaxBufferSize = 2147483647, 
    MaxReceivedMessageSize = 2147483647 
}; 

var endpoint = new EndpointAddress("URL.svc"); 

MyInterfaceClient client = new MyInterfaceClient(binding, endpoint); 

client.WSFunctionCompleted += (object sender, WSFunctionCompletedEventArgs e) => { 
    //access e.Result here 
}; 

client.WSFunctionAsync("XXXXXX"); 

Twój przebieg mogą się różnić. Daj mi znać, czy to działa.

+1

wykorzystując SvcUtil przyniesie podobne wyniki. Ale myślę, że całe pytanie dotyczy robienia tego "ręcznie". –

+0

Sądzę, że przynajmniej da mu kod do przeczytania, żeby to zrozumieć. Nie rozumiem, dlaczego musiałby to zrobić bez SvcUtil. –

+0

Zgadnij, czego potrzebuję !! Dziękuję Millie !! – Crasher

1
var binding = new BasicHttpBinding(); 
     binding.ProxyAddress = new Uri(string.Format("http://{0}:{1}", proxyAddress, proxyPort)); 
     binding.UseDefaultWebProxy = false; 
     binding.Security.Mode = BasicHttpSecurityMode.Transport; 
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
     binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic; 

     var endpoint = new EndpointAddress("serviceadress"); 

     var authenticationClient = new WOKMWSAuthenticateClient(binding, endpoint); 
     authenticationClient.ClientCredentials.UserName.UserName = username; 
     authenticationClient.ClientCredentials.UserName.Password = password; 

Jeśli chcesz go uruchomić na swoim lokalnym, powinieneś ten kod.

ServicePointManager.Expect100Continue = false;