2010-09-07 3 views
0

Я полный новичок ASP.NET. Я написал набор веб-сервисов, используя WCF 4 Rest Starter Kit. Я вызываю все из Flash-приложения, но я хочу написать для себя самую быструю и грязную панель администратора, которая не должна быть написана во Flash.Потребление WCF Rest 4 Из ASP. NET

Я полагаю, что это будет быстрее, чтобы запустить это в ASP. Таким образом, вопрос рассмотрит функцию WCF, как это:

[WebInvoke(UriTemplate = "/Login/", Method = "POST")] 
     public User Login(User user) 
     { 
      // Code here 
      // Either throw a WebFaultException or return the logged in user with a session id 

Как бы я потребляю это из страницы ASP .Net с именем пользователя, паролем, отправьте форму и он либо отображает ошибки 401 в и т.д. или успех (returneduser.sessionid).

Спасибо!

Примечание: Я знаю, как позвонить в службу поддержки по Http в C#. Это действительно вопрос о том есть «хороший путь» к должному это в ASP или это просто сделать вид, как:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<form action="WebForm2.aspx.cs" > 
    <asp:textbox id="Email" runat="server"/> 
    <asp:textbox id="Password" runat="server"/> 
    <asp:Button id="Button1" OnClick="OnButtonClick" runat="server" Text="Login"/> 
    </form> 
    <asp:Label ID="labelResult" runat="server" /> 
</asp:Content> 

Затем по щелчку в коде позади сделать что-то вроде этого:

protected void OnButtonClick(object sender, EventArgs e) 
     { 
      HttpWebRequest req = WebRequest.Create("http://localhost:35810/Users/Login/") as HttpWebRequest; 

      String userString = UsefulStuff.Serialization.SerializationUtil. 
       SerializeDataContractToString(typeof(User), new User() { Email = new Email(textboxUsername.text), 
                     Password = new Password(textboxPassword.text) }); 

      String strResponse = GetHttpPostResponse(req, userString); 

      User recievedUser = UsefulStuff.Serialization.SerializationUtil.DeserializeDataContractString(
       typeof(User), strResponse) as User; 

      labelResult.Text = recievedUser.SessionId; 
     } 


     public static String GetHttpPostResponse(HttpWebRequest httpWebRequest, String serializedPayload) 
     { 
      httpWebRequest.Method = "POST"; 
      httpWebRequest.ContentType = "text/xml"; 
      httpWebRequest.ContentLength = serializedPayload.Length; 

      StreamWriter streamOut = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.ASCII); 
      streamOut.Write(serializedPayload); 
      streamOut.Close(); 

      StreamReader streamIn = new StreamReader(httpWebRequest.GetResponse().GetResponseStream()); 

      string strResponse = streamIn.ReadToEnd(); 
      streamIn.Close(); 

      return strResponse; 
     } 

ответ

4

Базовый подход для вызова службы REST является HttpWebRequest

// User object serialized to XML 
XElement data = new XElement("User", 
    new XElement("UserName", UserName), 
    new XElement("Password", Password) 
); 

MemoryStream dataSream = new MemoryStream(); 
data.Save(dataStream); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(YourServiceUrl); 
request.Method = "POST"; 
request.ContentType = "application/xml"; 
// You need to know length and it has to be set before you access request stream 
request.ContentLength = dataStream.Length; 

using (Stream requestStream = request.GetRequestStream()) 
{ 
    dataStream.CopyTo(requestStream); 
    requestStream.Close(); 
} 

HttpWebResponse response = request.GetResponse(); 
if (response.Status == HttpStatusCode.Unauthorized) 
{ 
    ... 
} 
else 
{ 
    ... 
} 
response.Close(); 
+0

сладким, у меня уже есть код для отправки запроса, но буду использовать немного этот материал. мой вопрос, вероятно, не был точным, я просто задавался вопросом, был ли «хороший способ» сделать это, или вы просто делаете это в обработчике кнопок. –

+1

Я получаю эту ошибку: {«Невозможно закрыть поток до тех пор, пока все байты не будут записаны».} В requestStream.close(). но добавив это в использование байта [] bytes = dataSream1.ToArray(); requestStream.Write (байты, 0, Convert.ToInt16 (dataSream1.Length)); – Praneeth