使用web api创建数据库

时间:2016-05-11 20:24:38

标签: asp.net-mvc asp.net-web-api

我正在尝试使用web api在我的数据库中插入一个新条目。我有两个Web项目:一个是UI项目,其中所有用户交互都将发生,另一个是服务项目,它将处理与我的数据库的所有交互。

以下是我的帖子方法,该方法将采用表单数据来创建新团队。

// POST: Api/Team/Create
            [HttpPost]
            public ActionResult Create(Team team)
            {
                try
                {
                    if (ModelState.IsValid)
                    {
                        HttpEndPointContext httpEndPoint = new HttpEndPointContext()
                        {
                            AuthenticationMethod = HttpAuthenticationMethods.None,
                            Ssl = false,
                            HttpMethod = HttpMethod.Post,
                            Path = "localhost:32173/api/team/",
                            QueryStrings = null,
                            PayloadData = SerializationHelper.Current.Serialize(team.ToString(), SerializationTypes.Xml)
                        };

                        IProcessResult result = HttpConnectionManager.Current.SendMessage(httpEndPoint);
                    }
                    return RedirectToAction("Index");
                }
                catch
                {
                    return View();
                }
            }

这是我在上述方法中处理PayloadStream / PayloadData属性的方法:

private void StreamPayload(HttpWebRequest webRequest, HttpEndPointContext httpEndPointContext)
        {
            if (httpEndPointContext.HttpMethod == new HttpMethod("GET"))
                return;
            //TODO: FIX MAYBE .... sometimes we want to post body with GET.

            //Stream vs string
            if (httpEndPointContext.PayloadStream == null)
            {
                //Wrap with SOAP Envelope and method if defined in SoapDefinition
                string data = httpEndPointContext.PayloadData ?? String.Empty;

                if (httpEndPointContext.SoapDefinition != null)
                {
                    //If parameters is set, clear existing payload data.
                    data = String.Empty;

                    if (httpEndPointContext.SoapDefinition.Parameters != null)
                        foreach (var parameter in httpEndPointContext.SoapDefinition.Parameters)
                        {
                            data += String.Format("<{0}>{1}</{0}>", parameter.Key, parameter.Value);
                        }

                    data = String.Format("<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>" +
                                    "<s:Body><{0} xmlns='{2}'>" +
                                     "{1}</{0}></s:Body></s:Envelope>",
                                     httpEndPointContext.SoapDefinition.SoapMethod, data,httpEndPointContext.SoapDefinition.SoapGlobalKey);
                }

                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);

                httpEndPointContext.PayloadStream = new MemoryStream(byteArray);
            }

            using (Stream requestStream = webRequest.GetRequestStream())
            {
                StreamHelper.Current.CopyStreams(httpEndPointContext.PayloadStream, requestStream);

                requestStream.Close();
            }
        }

获取服务器响应的代码。我目前正在收到内部服务器(500)错误。不知道为什么。

public IProcessResult SendMessage(HttpEndPointContext httpEndPointContext)
            { 
                HttpWebRequest webRequest = CreateWebRequest(httpEndPointContext);

                StreamPayload(webRequest, httpEndPointContext);

                IProcessResult result = GetWebResponse(webRequest, httpEndPointContext);

                return result;
            }

            private IProcessResult GetWebResponse(HttpWebRequest webRequest, HttpEndPointContext httpEndPointContext)
            {
                //Get Response
                WebResponse response;

                IProcessResult result = new ProcessResult(Statuses.Success);

                try
                {
                    response = webRequest.GetResponse();
                }
                catch (System.Net.WebException ex)
                {
                    //Do exception handling. Still get the response for 500s etc.
                    result.Error.Exception = ex;
                    result.Status = Constants.Statuses.FailedUnknown;
                    result.ResponseCodeDescription = ex.Status.ToString();
                    result.ResponseCode = ex.Status.ToString();
                    result.Error.ErrorCode = ex.Status.ToString();

                    response = ex.Response;

                    //The error did not have any response, such as DNS lookup.
                    if (response == null)
                        return result;
                }

                try
                {
                    //Get the response stream.
                    Stream responseData = response.GetResponseStream();

                    if (responseData == null)
                        throw new CoreException("No Response Data in GetWebResponse.",
                            "No Response Data in GetWebResponse. EndPoint:{0}", httpEndPointContext.ToString());

                    // Open the stream using a StreamReader for easy access.
                    var reader = new StreamReader(responseData);

                    // Read the content.
                    result.ResponseData = reader.ReadToEnd();
                }
                finally
                {
                    response.Close();
                }

                result.ResponseCode = ((int)((HttpWebResponse)response).StatusCode).ToString();
                result.ResponseCodeDescription = ((HttpWebResponse) response).StatusDescription;

                return result;
            }

最后,我的插入数据库的方法可以在我的服务项目中找到:

//POST api/controller/5
        public IProcessResult Insert(Team team)
        {
            return TeamBusinessManager.Current.Insert(SecurityManager.Current.ConnectionContext, new Team());
        }

我很困惑为什么我得到500错误。我不确定它是否是我的POST方法中的PayloadData属性,或者我的服务项目中的方法是否有问题。

0 个答案:

没有答案