2010-09-07 60 views
0

我是一个完整的ASP .NET新手。我已经使用WCF 4 Rest Starter Kit编写了一组Web服务。我从Flash应用程序中调用了所有的东西,但是我想写一个快速且脏的管理面板供我自己使用,而不需要用Flash编写。从ASP中消费WCF Rest 4。 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#中调用Rest服务。这真的是有一个“好办法”,在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

甜蜜的,我已经有了代码发送请求,但会使用一些这方面的东西。我的问题可能不准确,那么我只是想知道是否有一个“好方法”来做到这一点,或者你只是在按钮点击处理程序中做到这一点。 – 2010-09-07 23:07:36

+1

我收到此错误:{“无法关闭流,直到写入所有字节。”}在requestStream.close()。但是使用block byte [] bytes = dataSream1.ToArray();requestStream.Write(bytes,0,Convert.ToInt16(dataSream1.Length)); – Praneeth 2012-04-13 02:11:42