#c# #silverlight #web-services #.net-4.0 #http-post
#c# #silverlight #веб-сервисы #.net-4.0 #http-post
Вопрос:
Я пытаюсь запустить этот код:
Приложение 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.Resu<
});
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 "amp;lat=" lat "amp;lng=" lng "amp;adr=" address "amp;desc=" photodesc "amp;story=" poistory);
String parameter = sr.ToString();
wc.UploadStringAsync(new Uri("http://localhost:80/"), "POST", parameter);
AddressTextBox.Text = parameter;
}
Веб-сервис cs:
[WebInvoke(UriTemplate = "createpoi?name={name}amp;lat={latitude}amp;lng={longitude}amp;adr={address}amp;desc={photodescription}amp;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) amp;amp;
!string.IsNullOrEmpty(latitude) amp;amp;
!string.IsNullOrEmpty(longitude) amp;amp;
!string.IsNullOrEmpty(address) amp;amp;
!string.IsNullOrEmpty(photodescription) amp;amp;
!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();
}
Веб-служба ничего не получает от клиента. Я делаю что-то не так?
Я могу связаться с сервером с помощью POST-запроса через WebClient OpenWriteAsync. Но мне нужен ответ сервера для последнего идентификатора, поэтому вместо этого я использую UploadStringAsync. Не могли бы вы, пожалуйста, помочь мне?
Пока, Чау
Ответ №1:
Попробуйте wc.UploadStringAsync(новый Uri(«http://localhost:80/createpoi «), «POST», параметры) и не забудьте urlencode ваших параметров
Ответ №2:
спасибо за совет! Теперь я знаю, как работает служба 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}amp;lat={latitude}amp;lng={longitude}amp;adr={address}amp;desc={photodesc}amp;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?
2. @ssmith Немного опоздал, я знаю, но это в системе. ServiceModel
3. Подсказка, если вы вводите имя типа и еще не импортировали его, просто нажмите ctrl точка, и VS найдет его для вас.