views:

57

answers:

1

Hello, I'm trying to send a POST request to a PHP script ("http://mywebsite/index/test/" in this case) once a button is clicked. I am using the WebClient's method UploadStringAsync for that but it doesn't seem to work:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MyWebsite
{
    public partial class Home : Page
    {
        WebClient client = new WebClient();

        public Home()
        {
            InitializeComponent();
            client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            // Create the request. 
            string postRequest = "<entry xmlns='http://www.w3.org/2005/Atom'&gt;"
            + "<title type='text'>New Restaurant</title>"
            + "<content type='xhtml'>"
            + "  <div xmlns='http://www.w3.org/1999/xhtml'&gt;"
            + "   <p>There is a new Thai restaurant in town!</p>"
            + "   <p>I ate there last night and it was <b>fabulous</b>.</p>"
            + "   <p>Make sure and check it out!</p>"
            + "  </div>"
            + " </content>"
            + " <author>"
            + "   <name>Pilar Ackerman</name>"
            + "  <email>[email protected]</email>"
            + " </author>"
            + "</entry>";

            // Sent the request to the specified URL.
            client.UploadStringAsync(new Uri("http://mywebsite/index/test/",
                UriKind.Absolute), postRequest); 
        }

        // Event handler for the UploadStringCompleted event.
        void client_UploadStringCompleted(object sender,
           UploadStringCompletedEventArgs e)
        {
            // Output the response. 
            if (e.Error != null)
                textBlock3.Text = e.Error.Message;
            else
                textBlock3.Text = e.Result;
        }

    }
}

I know the PHP script is not called because it writes a file with request information upon execution. However I am not getting any errors or notices in Visual Studio and I'm not sure what could be the problem.

EDIT:

I am using Silverlight 4, IIS7, PHP 5.3.3.

EDIT 2:

Ok, I managed to get this error by displaying e.Error.ToString():

System.Security.SecurityException ---> System.Security.SecurityException: Security error.

   at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)

   at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)

   at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState)

   --- End of inner exception stack trace ---

   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)

   at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

   at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)

   at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)
+2  A: 

Is the Silverlight hosted on the same domain as the webservice? If that isn't the case you need to create a clientaccesspolicy.xml file.

See here

Example:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Update: If you install Fiddler, you will be able to quickly confirm if it's indeed a crossdomain issue.

Arkain
Thanks this solved the problem.
Richard Knop
@Richard Knop, no problem
Arkain