2013-12-13 2 views
0

есть проблема.WebClient UploadString

Хотя пост-обработки с помощью веб-сервиса я получаю сообщение об ошибке

iqws webservis = new iqws(); 
    WebClient wc = new WebClient(); 
    var ser = new JavaScriptSerializer(); 
    var serializedResult = ser.Serialize(webservis.getProducts()); 
    wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 
    string result = wc.UploadString("http://localhost:3523/WS/iqws.asmx/getProducts", serializedResult); 
    var table = ser.Deserialize<Dictionary<string, dynamic>>(result); 

Но есть ошибка: Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

Почему?

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class iqws : System.Web.Services.WebService 
{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string getProducts() 
    { 
     List<products> prd= new List<products>(); 
     SqlConnection cn = new SqlConnection(ado.cnStr); 
     SqlCommand cmd = new SqlCommand("SELECT * FROM products", cn); 
     cn.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      products p = new products(); 
      p.name = dr["name"].ToString(); 
      p.money = dr["money"].ToString(); 
      prd.Add(p); 
     } 
     var jsonSerialiser = new JavaScriptSerializer(); 
     return jsonSerialiser.Serialize(prd); 
    } 
} 

И не оставлять JSON не проблема ..

$.ajax({ 
    type: "POST", 
    url: "/WS/iqws.asmx/getProducts", 
    contentType: "application/json; charset=utf-8", 
    //data: {}, 
    dataType: "json", 
    success: function (data) { 
     $("#jsonvalue").html(data.d); 
    }, 
    error: function (xhr, status, error) { 
     $("#jsonvalue").html(xhr.responseText); 
    } 
}); 

И результат;

[ 
    { 
    "name": "iPhone 4s Gold", 
    "code": null, 
    "money": "1899,0000", 
    "images": null, 
    "comments": null 
    }, 
    { 
    "name": "iPhone 5s Black", 
    "code": null, 
    "money": "2000,0000", 
    "images": null, 
    "comments": null 
    } 
] 

Почему я получаю ошибку?

+0

Почему вы пытаетесь загрузить продукты в 'getProducts()'? Сначала вы получаете продукты непосредственно из кода, вызывая 'webservis.getProducts()', затем вы пытаетесь загрузить эту коллекцию продуктов в метод 'getProducts()', вызвав 'wc.UploadString (...)' с помощью URL. Если вы хотите загружать продукты с помощью POST, вам нужен еще один метод 'addProducts (products [] p)', который будет принимать массив 'products' в качестве параметра. Если вы хотите загрузить список продуктов, используйте GET, используя что-то вроде 'wc.DownloadString (...)'. – nekno

ответ

0

В то время как я задаю вопрос, что вы пытаетесь выполнить с помощью своего кода, в конечном счете причина, по которой вы получаете ответ HTTP 500, заключается в том, что вы отправляете данные в метод веб-службы, который не принимает никаких параметров.

getProducts Для вызова с POST, вам нужно позвонить wc.UploadString(...) с пустой строкой:

string result = wc.UploadString("http://localhost:3523/WS/iqws.asmx/getProducts", String.Empty); 

Это будет получать список продуктов. Чтобы загрузить продукт, вам нужен другой метод веб-службы, например .:

public class Product 
{ 
    public String Name { get; set; } 
    public String Code { get; set; } 
    public String Money { get; set; } 
    public String Images { get; set; } 
    public String Comments { get; set; } 
} 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[ScriptService] 
public class iqws : System.Web.Services.WebService 
{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string getProducts() 
    { 
     List<Product> prd = new List<Product>(); 
     //{ 
     // new Product() { Name = "myname", Code = "mycode" }, 
     // new Product() { Name = "myname2", Code = "mycode2" } 
     //}; 
     using (SqlConnection cn = new SqlConnection(ado.cnStr)) 
     { 
      SqlCommand cmd = new SqlCommand("SELECT * FROM Product", cn); 
      cn.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       Product p = new Product(); 
       p.Name = dr["name"].ToString(); 
       p.Money = dr["money"].ToString(); 
       prd.Add(p); 
      } 
     } 

     return new JavaScriptSerializer().Serialize(prd); 
    } 

    [WebMethod] 
    [ScriptMethod] 
    [GenerateScriptType(typeof(Product))] 
    public void addProduct(Product p) 
    { 
     // Place your validation code here to ensure the Product property values are in expected whitelists. 
     using (SqlConnection cn = new SqlConnection(ado.cnStr)) 
     { 
      SqlCommand cmd = new SqlCommand("INSERT INTO Product (Name, Money) VALUES (@Name, @Money)", cn); 
      cmd.Parameters.AddWithValue("@Name", p.Name); 
      cmd.Parameters.AddWithValue("@Money", p.Money); 

      cn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

И опрашивать сервис:

 var ser = new JavaScriptSerializer(); 
     WebClient wc = new WebClient(); 
     wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 
     string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/WS/iqws.asmx/getProducts"; 
     string json = wc.UploadString(url, String.Empty); 
     var data = ser.Deserialize<Dictionary<String, String>>(json); 
     List<Product> products = ser.Deserialize<List<Product>>(data["d"]); 
+0

Большое спасибо за помощь, эта структура более полезна для меня, это то, что я хотел – bykrkc

Смежные вопросы