Note this works with the released version of Silverlight 2
I created a Silverlight 2 beta 2 app which uses a WCF Silverlight service which worked fine localy but did call the service when I published it to my web host. After playing around with the different settings I finally came across an entry in the Silverlight Forums by sladapter with a solution.
So lets create a simple Silverlight 2 App to demo how to do this. I created a silverlight app with a web application project. I prefer web applications to web sites but a web site will work the same.
Add a WCF Silverlight- enabled service named service1 to the web application.
This is the code I am using for the service
Imports System.ServiceModel
Imports System.ServiceModel.Activation
Imports System.ServiceModel.Activation
<ServiceContract(Namespace:="")> _
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class Service1
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class Service1
<OperationContract()> _
Public Function SayHello() As String
' Add your operation implementation here
Return "Hello World"
End Function
End Class
Public Function SayHello() As String
' Add your operation implementation here
Return "Hello World"
End Function
End Class
Lets add a TextBlock to the Page.xaml to display our message.
<UserControl x:Class="SilverlightApplication2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="txt">Loading..</TextBlock>
</Grid>
</UserControl>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="txt">Loading..</TextBlock>
</Grid>
</UserControl>
Now run the app. Once that is done we can add a service reference to our silverlight app. Press the arrow on the Discover button and select services in the solution. You should windup with something like this.
In the silverlight app open up the file ServiceReferences.ClientConfig
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Service1" maxBufferSize="65536"
maxReceivedMessageSize="65536">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:1205/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_Service1" contract="ServiceReference1.Service1"
name="BasicHttpBinding_Service1" />
</client>
</system.serviceModel>
</configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Service1" maxBufferSize="65536"
maxReceivedMessageSize="65536">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:1205/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_Service1" contract="ServiceReference1.Service1"
name="BasicHttpBinding_Service1" />
</client>
</system.serviceModel>
</configuration>
In the endpoint address change the contract to include the project name.
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Service1" maxBufferSize="65536"
maxReceivedMessageSize="65536">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:1205/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_Service1" contract="SilverlightApplication2.ServiceReference1.Service1"
name="BasicHttpBinding_Service1" />
</client>
</system.serviceModel>
</configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Service1" maxBufferSize="65536"
maxReceivedMessageSize="65536">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:1205/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_Service1" contract="SilverlightApplication2.ServiceReference1.Service1"
name="BasicHttpBinding_Service1" />
</client>
</system.serviceModel>
</configuration>
Now lets add some code to call the service. Page.Xaml.VB
Partial Public Class Page
Inherits UserControl
Dim current As String
Inherits UserControl
Dim current As String
Public Sub New()
InitializeComponent()
End Sub
InitializeComponent()
End Sub
Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Dim ws As New ServiceReference1.Service1Client
AddHandler ws.SayHelloCompleted, AddressOf HelloComplete
ws.SayHelloAsync()
End Sub
Dim ws As New ServiceReference1.Service1Client
AddHandler ws.SayHelloCompleted, AddressOf HelloComplete
ws.SayHelloAsync()
End Sub
Private Sub HelloComplete(ByVal sender As Object, ByVal e As ServiceReference1.SayHelloCompletedEventArgs)
txt.Text = e.Result
End Sub
txt.Text = e.Result
End Sub
End Class
Now if we run the app you should see Hello World but when published you will only see loading. So lets change how we create the service so that this will work once deployed. Basically we tell the service to use the current web address.
Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Dim address = New Uri(Application.Current.Host.Source, "../Service1.svc")
Dim address = New Uri(Application.Current.Host.Source, "../Service1.svc")
Dim ws As New ServiceReference1.Service1Client("BasicHttpBinding_Service1", address.AbsoluteUri)
AddHandler ws.SayHelloCompleted, AddressOf HelloComplete
ws.SayHelloAsync()
End Sub
AddHandler ws.SayHelloCompleted, AddressOf HelloComplete
ws.SayHelloAsync()
End Sub
Hope this helps
No comments:
Post a Comment