2011-05-30 47 views
3

我試圖讓這個代碼運行:的Silverlight 4.0:使用Web客戶端UploadStringAsync POST請求到.NET 4 Webservice的

Silverlight應用程序xaml.cs:

private void SavePoiRequest(MyPushpin pin) 
    { 
     WebClient wc = new WebClient(); 
     wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
     wc.Encoding = Encoding.UTF8; 
     wc.UploadStringCompleted += new UploadStringCompletedEventHandler((sender, e) => 
     { 
      if (e.Error != null) 
      { 
       return; 
      } 
      AddressTextBox.Text = e.Result; 
     }); 
     String name = pin.Name; 
     String lat = pin.Location.Latitude.ToString().Replace(",","."); 
     String lng = pin.Location.Longitude.ToString().Replace(",","."); 
     String address = pin.Address; 
     String photodesc = pin.PhotoDesc; 
     String poistory = pin.Tag.ToString(); 
     StringBuilder sr = new StringBuilder(); 
     sr.Append("createpoi?name="+name+ "&lat=" + lat + "&lng=" + lng + "&adr=" + address  + "&desc=" + photodesc + "&story=" + poistory); 
     String parameter = sr.ToString(); 
     wc.UploadStringAsync(new Uri("http://localhost:80/"), "POST", parameter); 
     AddressTextBox.Text = parameter; 
    } 

Webservice的CS:

[WebInvoke(UriTemplate = "createpoi?name={name}&lat={latitude}&lng={longitude}&adr={address}&desc={photodescription}&story={poistory}", Method = "POST")] 
    public String SetPoiPOST(string name, string latitude, string longitude, string address, string photodescription, string poistory) 
    { 
     int newid = -1; 
     POI_Man poimanager = new POI_Man(); 
     MemoryStream resultstream = new MemoryStream(); 

     if (!string.IsNullOrEmpty(name) && 
      !string.IsNullOrEmpty(latitude) && 
      !string.IsNullOrEmpty(longitude) && 
      !string.IsNullOrEmpty(address) &&     
      !string.IsNullOrEmpty(photodescription) && 
      !string.IsNullOrEmpty(poistory) 
      ) 
     { 
      //newid = poimanager.CreatePOI_alt(address, name, photodescription, poistory); 
      newid = poimanager.CreatePOI(name, latitude, longitude, address, photodescription, poistory); 
      poimanager.Generate("xml"); 
      resultstream = poimanager.WriteMessage(newid.ToString()); 
      WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; 
     } 

     if (poimanager.NoError) 
     { 
      resultstream = poimanager.WriteMessage(newid.ToString()); 
      WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; 
      //resultstream = (this.GetPoi(newid.ToString()) as MemoryStream); 
     } 
     else 
     { 
      resultstream = poimanager.WriteMessage("Beim anlegen des POI ist ein Fehler aufgetreten." 
       + Environment.NewLine + "Haben Sie einen Parameter vergessen?"); 
      WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; 

     } 
     return newid.ToString(); 
    } 

Web服務不會從客戶端獲取任何內容。難道我做錯了什麼?

我可以通過WebClient OpenWriteAsync通過POST請求聯繫服務器。但我需要服務器對lastID的響應,所以我使用UploadStringAsync來代替。 你能幫我嗎?

再見 洲

回答

5

嘗試wc.UploadStringAsync(新的URI( 「HTTP://本地主機:80/createpoi」), 「POST」,參數),記得來urlencode您的參數

4

THX爲建議!我現在知道REST服務是如何工作的。它只讀取URL而不讀取UploadStringAsync()函數的參數。 所以我重寫了代碼,它像一個魅力。

private void SavePoiRequest(MyPushpin pin) 
    { 
     WebClient wc = new WebClient(); 
     wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
     wc.Encoding = Encoding.UTF8; 
     wc.UploadStringCompleted += new UploadStringCompletedEventHandler((sender, e) => 
     { 
      if (e.Error != null) 
      { 
       return; 
      } 
      lastID = int.Parse(e.Result); 
     }); 
     Uri baseAddressUri = new Uri("http://localhost:80/"); 
     UriTemplate uriTemplate = new UriTemplate("createpoi?name={name}&lat={latitude}&lng={longitude}&adr={address}&desc={photodesc}&story={poistory}"); 

     IDictionary<string, string> parameters = new Dictionary<string, string>(); 
     parameters.Add("name", pin.Name); 
     parameters.Add("latitude", pin.Location.Latitude.ToString().Replace(",", ".")); 
     parameters.Add("longitude", pin.Location.Longitude.ToString().Replace(",", ".")); 
     parameters.Add("address", pin.Address); 
     parameters.Add("photodesc", pin.PhotoDesc); 
     parameters.Add("poistory", pin.Tag.ToString()); 
     Uri formattedUri = uriTemplate.BindByName(baseAddressUri, parameters); 
     wc.UploadStringAsync(formattedUri, "POST"); 
    } 
+1

UriTemplate定義在哪裏? – ssmith 2011-09-23 14:23:32

+0

@ssmith Bit遲了我知道,但它在System.ServiceModel – 2013-06-14 08:36:16

+0

protip,如果你寫一個類型名稱,還沒有導入它,只要按Ctrl +句點和VS會爲你找到它。 – zneak 2014-05-26 18:02:58