当前位置: 代码网 > it编程>编程语言>C# > C#使用MVC框架创建WebApi服务接口的流程步骤

C#使用MVC框架创建WebApi服务接口的流程步骤

2025年02月14日 C# 我要评论
第一步,使用vs2019新建mvc-web api应用程序创建bridgeapi第二步,运行将生成默认的示例网页,网页url为https://localhost:44361/home/index右键

第一步,使用vs2019新建mvc-web api应用程序

创建bridgeapi

第二步,运行将生成默认的示例网页,网页url为

https://localhost:44361/home/index

右键 项目 添加 webapi控制器类

添加 

我们可以看到app_start目录下 有三个文件:

bundleconfig.cs代表 捆绑文件的引用 

有脚本文件scriptbundle的引用(javascript文件,后缀名.js)

和层叠样式表文件stylebundle(即css网页排版文件,后缀名.css)

filterconfig.cs代表全局筛选器

routeconfig.cs代表url路由模式和action信息

右键,项目,将类库项目更新为控制台应用程序,并添加类program

添加开源框架topshelf的引用,添加owin框架的引用

topshelf 框架

topshelf 是一个开源的跨平台的宿主服务框架,支持 windows 和 mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

使用 topshelf 可以非常方便的将一个 c# 控制台程序部署成为一个 windows service, 使用它可以很方便的构建跨平台服务寄主,而在调试时直接以控制台的形式运行即可,非常方便。

owin框架

owin 允许 web 应用从 web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 webapi应用程序和中间件可以与基于 owin 的应用程序、服务器和中间件进行互操作。

我们在web.config(有些是app.config)增加webapi地址和端口

apiaddress和apiport

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 asp.net 应用程序的详细信息,请访问
  https://go.microsoft.com/fwlink/?linkid=301880
  -->
<configuration>
  <appsettings>
    <add key="webpages:version" value="3.0.0.0" />
    <add key="webpages:enabled" value="false" />
    <add key="clientvalidationenabled" value="true" />
    <add key="unobtrusivejavascriptenabled" value="true" />
	  <add key="apiaddress" value="" />
	  <add key="apiport" value="45678" />
  </appsettings>
</configuration>

program.cs如下:

using microsoft.owin.hosting;
using owin;
using system;
using system.collections.generic;
using system.configuration;
using system.linq;
using system.net;
using system.threading;
using system.threading.tasks;
using system.web;
using system.web.http;
using topshelf;
using topshelf.hostconfigurators;
/*
* topshelf 是一个开源的跨平台的宿主服务框架,支持 windows 和 mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
* 使用 topshelf 可以非常方便的将一个 c# 控制台程序部署成为一个 windows service, 使用它可以很方便的构建跨平台服务寄主,
* 而在调试时直接以控制台的形式运行即可,非常方便。
* owin框架
* owin 允许 web 应用从 web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 
* webapi应用程序和中间件可以与基于 owin 的应用程序、服务器和中间件进行互操作。
*/
 
namespace bridgeapi
{
    public class program
    {
        static void main(string[] args)
        {
            console.writeline("webapi程序启动开始...");
            hostfactory.run(new action<hostconfigurator>(hostconf));
            console.readline();
        }
 
        public static void hostconf(hostconfigurator hostconfigurator)
        {
            // 服务使用network_service内置帐户运行。身份标识,有好几种方式,如:x.runas("username", "password");  x.runasprompt(); x.runasnetworkservice(); 等
            hostconfigurator.runaslocalservice();//以服务
            //x.startautomatically();//startmodeextensions
            //x.startmanually();//手动模式
 
            hostconfigurator.setdescription("webapiserver 斯内科 topshelf host服务的描述"); //安装服务后,服务的描述
            hostconfigurator.setdisplayname("webapiserversnake"); //显示名称
            hostconfigurator.setservicename("webapiserversnake"); //服务名称
            type t = hostconfigurator.gettype();//topshelf.hostconfigurators.hostconfiguratorimpl
            console.writeline(t.tostring());
 
            hostconfigurator.service<towncrier>(s =>
            {
                s.constructusing(name => new towncrier());     //配置一个完全定制的服务,对topshelf没有依赖关系。常用的方式。
                                                               //the start and stop methods for the service
                s.whenstarted(tc => tc.start());              //4
                s.whenstopped(tc => tc.stop());
            });
        }        
    }
 
    public class towncrier
    {
        public towncrier()
        {
        }
        public void start()
        {
            task.factory.startnew(() =>
            {
                bool isstarted = false;
                while (!isstarted)
                {
                    try
                    {
 
                        string log = "服务启动成功。";
                        string urlkey = "apiaddress";
                        string portkey = "apiport";
                        if (!configurationmanager.appsettings.allkeys.contains(urlkey))
                        {
                            log = $"服务启动出现异常:app.config文件中不存在配置[{urlkey}]";
                            console.writeline(log);
                            return;
                        }
                        if (!configurationmanager.appsettings.allkeys.contains(portkey))
                        {
                            log = $"服务启动出现异常:app.config文件中不存在配置[{portkey}]";
                            console.writeline(log);
                            return;
                        }
                        string apiurl = configurationmanager.appsettings[urlkey].tostring();
                        string apiport = configurationmanager.appsettings[portkey].tostring();
                        bool rtn = int.tryparse(apiport, out int port);
                        if (!rtn)
                        {
                            log = $"服务启动出现异常:app.config文件中配置[{portkey}]值错误";
                            console.writeline(log);
                            return;
                        }
                        startoptions options = new startoptions();
                        //options.urls.add($"http://localhost:{apiport}");
                        options.urls.add($"http://127.0.0.1:{apiport}");
                        //options.urls.add($"http://{environment.machinename}:{apiport}");
                        if (!string.isnullorempty(apiurl))
                        {
                            options.urls.add($"http://{apiurl}:{apiport}");
                        }
                        else
                        {
                            #region //自动绑定所有ip
                            string hostname = dns.gethostname();
                            ipaddress[] ipaddresses = dns.gethostaddresses(hostname);
                            foreach (ipaddress ipaddress in ipaddresses)
                            {
                                //ipv4
                                if (ipaddress.addressfamily == system.net.sockets.addressfamily.internetwork)
                                {
                                    options.urls.add($"http://{ipaddress}:{apiport}");
                                }
                            }
                            #endregion
                        }
                        
                        string urls = new system.web.script.serialization.javascriptserializer().serialize(options.urls);
                        log = $"开始启动服务,服务地址:{urls}";
                        console.writeline(log);
 
                        //owin 托管服务器问题:startoptions webapp.start targetinvocationexception
                        // start owin host ,启动一个webapi程序
                        //  public static idisposable start(string url, action<iappbuilder> startup);
 
                        webapp.start(options, startup: configuration);
                        console.writeline($"服务启动成功。");
                        isstarted = true;
                    }
                    catch (exception ex)
                    {
                        console.writeline($"服务启动出现异常:{ex.message}");
                        thread.sleep(2000);
                    }
                }
            });
        }
        public void stop()
        {
            console.writeline($"webapi服务退出");
        }
 
        public void configuration(iappbuilder appbuilder)
        {
            // configure web api for self-host. 
            httpconfiguration config = new httpconfiguration();
            config.maphttpattributeroutes();
            config.routes.maphttproute(
                name: "defaultapi",
                routetemplate: "{controller}/{action}/{id}",
                defaults: new { id = routeparameter.optional }
            );
            appbuilder.usewebapi(config);
        }
    }
}

 控制器类bridgecontroller如下:

using system;
using system.collections.generic;
using system.linq;
using system.net;
using system.net.http;
using system.web.http;
 
namespace bridgeapi
{
    [routeprefix("bridge")]
    public class bridgecontroller : apicontroller
    {
        /// <summary>
        /// 测试api端口,假设传入一个json字符串{"testname":"斯内科"}
        /// 请求路由url不区分大小写
        /// http://127.0.0.1:45678/bridge/testapi
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        [route("testapi")]
        [httppost]
        public httpresponsemessage testapi(object objtext) 
        {
            try
            {
                microsoft.owin.owincontext context = ((microsoft.owin.owincontext)request.properties["ms_owincontext"]);
                string remoteclient = context.request.remoteipaddress + ":" + context.request.remoteport;
                if (objtext == null)
                {
                    string returndatang = newtonsoft.json.jsonconvert.serializeobject(new responsecontent()
                    {
                        code = 12345,
                        message = $"解析失败,请求参数为空,源文本【{objtext}】"
                    });
                    return new httpresponsemessage()
                    {
                        content = new stringcontent(returndatang, system.text.encoding.utf8, mediatype: "application/json")
                    };
                }
                string json = objtext.tostring();
                testclass testclass = newtonsoft.json.jsonconvert.deserializeobject<testclass>(json);
                if (testclass == null || string.isnullorempty(testclass.testname))
                {
                    string returndatang = newtonsoft.json.jsonconvert.serializeobject(new responsecontent()
                    {
                        code = 12345,
                        message = $"解析失败,testname为空,源json【{json}】"
                    });
                    return new httpresponsemessage()
                    {
                        content = new stringcontent(returndatang, system.text.encoding.utf8, mediatype: "application/json")
                    };
                }
                string returndata = newtonsoft.json.jsonconvert.serializeobject(new responsecontent()
                {
                    code = 0,
                    message = "",
                    data = $"接收到【{remoteclient}】上抛数据【{json}】,已处理ok,返回一个随机数【{new random().next(1, 100)}】"
                });
                return new httpresponsemessage()
                {
                    content = new stringcontent(returndata, system.text.encoding.utf8, mediatype: "application/json")
                };
            }
            catch (exception ex) 
            {
                string returndatang = newtonsoft.json.jsonconvert.serializeobject(new responsecontent()
                {
                    code = -1,
                    message = $"处理时出现错误【{ex.message}】"
                });
                return new httpresponsemessage()
                {
                    content = new stringcontent(returndatang, system.text.encoding.utf8, mediatype: "application/json"),
                    statuscode = httpstatuscode.badrequest
                };
            }
        }
    }
 
    public class testclass
    {
        public string testname { get; set; }
    }
 
    /// <summary>
    /// 接口反馈的响应内容对象
    /// </summary>
    public class responsecontent 
    {
        /// <summary>
        /// 错误号,code为0代表ok
        /// </summary>
        public int code { get; set; }
        /// <summary>
        /// 错误描述,code为0,这里显示空
        /// </summary>
        public string message { get; set; }
        /// <summary>
        /// 相关数据信息,该data可以是数组、键值对字典、字符串等任意类型数据
        /// </summary>
        public object data { get; set; }
    }
}

运行,将其按照服务进行

使用postman测试webapi 接口,如下

以上就是c#使用mvc框架创建webapi服务接口的流程步骤的详细内容,更多关于c# mvc创建webapi接口的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com