2016-06-17 3 views
1

Итак, я изучаю веб-службы в ASP.NET, и у меня есть вопрос. У меня есть два метода: Добавить (то есть сумма двух чисел) и GetCalculations (который отображает последние вычисления с помощью свойства EnabledSession). Когда я открываю свой .asmx в браузере, он показывает сумму и последние вычисления в XML-файле, но когда я открываю свою веб-форму в браузере, я могу сделать сумму, но вычисления не отображаются.Ошибка при использовании веб-службы ASP.NET

Это мои коды:

WebForm1.aspx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace CalculatorWebApplication 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void btnAdd_Click(object sender, EventArgs e) 
     { 
      CalculatorService.CalculatorWebServiceSoap client = 
       new CalculatorService.CalculatorWebServiceSoapClient(); 
      int result = client.Add(Convert.ToInt32(txtFirstNumber.Text), 
       Convert.ToInt32(txtSecondNumber.Text)); 
      lblResult.Text = result.ToString(); 

      gvCalculations.DataSource = client.GetCalculations(); 
      gvCalculations.DataBind(); 

      gvCalculations.HeaderRow.Cells[0].Text = "Recent Calculations"; 
     } 
    } 
} 

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CalculatorWebApplication.WebForm1" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <table style="font-family:Arial"> 
     <tr> 
      <td> 
       <b>First Number</b> 
      </td> 
      <td> 
       <asp:TextBox ID="txtFirstNumber" runat="server"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <b>Second Number</b> 
      </td> 
      <td> 
       <asp:TextBox ID="txtSecondNumber" runat="server"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <b>Result</b> 
      </td> 
      <td> 
       <asp:Label ID="lblResult" runat="server"></asp:Label> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <asp:GridView ID="gvCalculations" runat="server"> 

       </asp:GridView> 
      </td> 
     </tr> 
    </table> 
    </form> 
</body> 
</html> 

CalculatorWebService.asmx.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace WebServicesDemo 
{ 
    /// <summary> 
    /// Summary description for CalculatorWebService 
    /// </summary> 
    [WebService(Namespace = "http://pragimtech.com/webservices")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService] 
    public class CalculatorWebService : System.Web.Services.WebService 
    { 

     [WebMethod(EnableSession = true)] 
     public int Add(int firstNumber, int secondNumber) 
     { 
      List<string> calculations; 
      if (Session["CALCULATIONS"] == null) 
      { 
       calculations = new List<string>(); 
      } 
      else 
      { 
       calculations = (List<string>)Session["CALCULATIONS"]; 
      } 

      string strRecentCalculation = firstNumber.ToString() + " + " 
       + secondNumber.ToString() + " = " 
       + (firstNumber + secondNumber).ToString(); 
      calculations.Add(strRecentCalculation); 
      Session["CALCULATIONS"] = calculations; 

      return firstNumber + secondNumber; 
     } 

     [WebMethod(EnableSession = true)] 
     public List<string> GetCalculations() 
     { 
      if (Session["CALCULATIONS"] == null) 
      { 
       List<string> calculations = new List<string>(); 
       calculations.Add("You have not performed any calculations"); 
       return calculations; 
      } 
      else 
      { 
       return (List<string>)Session["CALCULATIONS"]; 
      } 
     } 
    } 
} 
+0

интересно ... если вы представите его второй раз, появится ли первый расчет? – ppostma1

+0

Да, это идея. –

+0

просто добавьте параметр в метод GetCalculations(), затем попробуйте –

ответ

1

На сервере сторона: с EnabledSe ssion в веб-службе, веб-служба будет иметь основное состояние сеанса и сохраняет предыдущие вычисления в состоянии сеанса для одного и того же клиента. Как веб-служба знает, что это тот же клиент? Cookie.

Когда вы используете браузер, cookie будет использоваться и храниться в вашем браузере. Это позволяет веб-службе идентифицировать клиента. Результат: вы видите предыдущие вычисления в ответе xml.

Когда вы вызываете его из веб-формы, вам нужен дополнительный шаг, чтобы файлы cookie использовались. Для клиента ASMX веб-службы (если добавить WebReference), то это будет что-то вроде:

client.CookieContainer = new CookieContainer 

Для клиента службы WCF (если добавить ServiceReference), вы можете включить куки из конфигурации:

<system.ServiceModel> 
    <bindings> 
     <basicHttpBinding allowCookies="true"> 
    </bindings> 
...... 
</system.ServiceModel>