0

我必须调用 Web 服务 (JSON) 来验证尝试登录应用程序的用户。我提供了以下 xml

  <summary>
  http://geniewebsvc.cloudapp.net/Member.svc/Authenticate
 </summary>
  <param name="payload">
    {"UserName":"testuser@somedomain.com","Password":"p@$$w0rd"}
  </param>
  <requiredHeaders>
  Content-Type: application/json;charset=UTF-8
  </requiredHeaders>
  <returns></returns>
    [OperationContract]
    [WebInvoke(UriTemplate = "/Authenticate", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    AuthenticateResponse Authenticate(AuthCredentials usernamePassword);

有一个类似的方法来检查用户 ID 是否已经注册,这是一个 Get 方法。这很好,我收到了成功和不成功案例的正确响应。但是所有的 post 方法都是给我带来麻烦的方法。我注意到这些 xml 中还有一个不同之处.. 即.. isregistered webservice param 标记是这样的..

 <param name="emailAddress"></param>

这是我的 get() 和 post() 请让我知道我的错误是什么......

public void Post()
    {
        RequestState myRequestState = new RequestState();
        try
        {
            System.Uri uri = new Uri(url);
            HttpWebRequest myHttpWebGetRequest;
            Logger.log(TAG, "Create a HttpWebrequest object to the URL", url);
            myHttpWebGetRequest = (HttpWebRequest)WebRequest.Create(uri);
            _mHttpWebRequest = myHttpWebGetRequest;
            myRequestState.conn = this;
            myRequestState.request = myHttpWebGetRequest;
            myRequestState.request.ContentType = "application/json;charset=UTF-8";

            myRequestState.request.Method = "POST";
            myRequestState.request.AllowReadStreamBuffering = false;
            myRequestState.request.Headers["UserName"] = "rick.labarbera@gmail.com";
            myRequestState.request.Headers["Password"] = "125124514";
            // myRequestState.request.Headers["MemberId"] = "UdE8IwmTbxEjmzmMo2nBpg==";

            IAsyncResult result = (IAsyncResult)myHttpWebGetRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
        }
        catch (Exception e)
        {
            close(myRequestState);
            if (this.listener != null)
            {
                Logger.log(TAG, "post()", e.Message);
            }
        }
    }

 public void Get()
    {
        RequestState myRequestState = new RequestState();
        try
        {
            System.Uri uri = new Uri(url);
            HttpWebRequest myHttpWebPostRequest;
            Logger.log(TAG, "Create a HttpWebrequest object to the URL", url);
            myHttpWebPostRequest = (HttpWebRequest)WebRequest.Create(uri);
            _mHttpWebRequest = myHttpWebPostRequest;
            myRequestState.conn = this;
            myRequestState.request = myHttpWebPostRequest;
            myRequestState.request.Method = "GET";
            myRequestState.request.AllowReadStreamBuffering = false;

            IAsyncResult result = (IAsyncResult)myHttpWebPostRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
        }
        catch (Exception e)
        {
            close(myRequestState);
            if (this.listener != null)
            {
                Logger.log(TAG, "get()", e.Message);
            }
        }
    }

我做错了什么吗?所有这些事情对我来说都是非常新的......我非常需要帮助......

谢谢 :)

4

1 回答 1

0

我用你的代码玩了一点,但做不到:(

您用于 POST() 方法和 GET() 方法的 URL 是什么?

顺便说一句,还有另一种方法可以调用您的服务。按着这些次序:

-- 创建一个新项目。
-- 右键单击​​项目名称并单击“添加服务引用”...然后提供地址为“http://geniewebsvc.cloudapp.net/Member.svc”并单击“Go”。
-- 下载服务信息后,提供类似“MyMemberService”之类的命名空间,然后单击“确定”。

然后转到您的 MainPage.xaml.cs 并编写以下代码。

MemberServiceClient client = new MemberServiceClient();
client.AuthenticateCompleted += new EventHandler<AuthenticateCompletedEventArgs>(client_AuthenticateCompleted);
client.AuthenticateAsync(new AuthCredentials() { UserName = "rick.labarbera@gmail.com", Password = "125124514" });

AuthenticateCompleted 处理程序是

void client_AuthenticateCompleted(object sender, AuthenticateCompletedEventArgs e)
{
    MessageBox.Show(e.Result.Successful.ToString());
}

这样,您只需 2 或 3 行代码就可以简单地调用 MemberService 中的任何服务。这就是在 Visual Studio 项目中调用 soap 客户端的方式。

但同样,您需要解决一些“端点配置”问题。如果你能做到这一点,你可以节省至少 30% 到 40% 的开发时间。

祝你好运。

于 2012-09-28T10:55:14.523 回答