原文:Routing in ASP.NET Web API

  在我们新建一个Web API项目时,会在App_Start文件夹下的WebApiConfig.cs中定义一个默认路由:

            config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

  在默认路由中加入“api”是为了避免与ASP.NET MVC的路由冲突。当然如果你不喜欢这个约定,可以修改默认路由。

  路由匹配规则:{controller}和{id}略过,只介绍action的匹配。

    1.Web API首先根据HTTP方法名寻找命名以HTTP方法名开头的action。举例:

public class ProductsController : ApiController
{
public void GetAllProducts() { }
public IEnumerable<Product> GetProductById(int id) { }
public HttpResponseMessage DeleteProduct(int id){ }
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApgAAADfCAIAAADdkTRjAAAZVklEQVR4nO2cMZKjPBOG9yzUv7exDjMzxUV2qhxwjQkm4RROHJFsbX35Zpv5D2xAEk2DwcZt9/OUa8vGDWLR2/0iCc+Pv+CJ33/+e/QpgEUQBuigEMv8ePQJwKaQjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGUwcl+QjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGVe2Mi/3n6GX4ft9zXNc2bjy3aHHbYVxtfbz59vXxs2CKt5ztLhhWuNfFhSz1sOv8LP//1MX+H9Tdj4efj79dZvEQv019vPn/97lxL9631kl+HpYeQCS7NxrN///k16s+vQTg9ZL052vdjiy3aHHVaW6a/3kYSNQujEp2ZF6ZiZ8vfj9bV3KyNXArSYw2f4X/gcXOGvt59hF4bHOfwK4naxIYxc4D5GHn319d6a94QSRrpebPFlu8MOq4z88LkL729Bd3I68blZXzqmUv5+vL72HmzkSvzbe8ju8Q+fYff5GcV3w77w6/D37+Fz1936vX9djvx12biL9PP1Hk8P/B1uT1t5Ke5u5KPbh8eJ3n+9d2P6t68ruhJuxRojP3yG3efh/G+8vU+o93ehQw95WJSPSY8zCW+BW5SO8ZTvvj13+lkJesx5YxsTiUT3hUGA2PSzYdfIfx3EvfqN/Wze4XN3ufrZkWNBtH0Y3RXG84Hx9sNneNws0H25t5EfPrvbr/lGfvj13iaPPKCXuxJuyAojP/wKbcWMimCUUIevr8NY1o/kIz1ujpsa+VjKxz46FXO28MvmXiRTvjAW8KwWfmaBkQ+Wve8ztf7rELtC9170j7aUjN4iKMNHcR74Zadi7r1GHo3Jlk2tiz3FNPvdWW7kfTXs0vDv1B3/VflIj5vgblPr+hyeEjOpqElfEAOekkeNyLvSLz/SNugV8c3wZmJON8ctTm5/Ne46Ik8TdUwJQtcfPsP1XQm3ZLGRxzPq0fssof5en4/0uC1u8bDb/JSfEzOmqElf0AOekodPrU+0ch6ISxO282dulb0Ykc/k8CukS5WHz5106dLZ0UklXPaR7B8j35RblOm4WDMifzVuNwaYk/KLy8JVvqCe5FNh3cjbSiF0g/SLl+nq//X+U1wjz98/eb+OsWbgFd9Qjxv2/IzqjyU9nYCRb8pCYSTV9m98wxcpRFsjH8lHetwcdzLykZRfXhamfGE64Bmxb+TJSvnoJEnS5cMnYwcdKTy13v8U/u3r6ft1jDUPJ/fXLfmVvzghFnajvyMfXtj+yse/F5jTlXArlgnj6z3/EUGUrXFCtV9d9dQ6PW6JWxq5nPJZ5GSM8l7xBTHg6TX2wn/ZDQT480wggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGUwcl+QjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGUwcl+QjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZX78/vMfL168ePHixetJXz/+gSd+//nvBDAAYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu6LTbKxLouirDdoJVTNvVvxgqUy3fXsPboY2SzEkkIgZ6GRf38UPbv9cbCtKHb743G/K3IuwfAYHpSNdXl7Z7+2IlPBNVYKoy6jHNcus9ALg/u+oZHHh1/ZichmIWtLx31u7+9RWZ6RBUb+/ZHa8ffHx/dl+5hLK1/BpjzGyO+SbVTkW7JCGHWZumtdKp096IWmCqEsQ7yLaOSXvZoqrOtGZLOQVaWjqcKdruL9jvxUXG3k456MkT8By7MxGhS1Rbcui1DVVcg257WvSzU1/ry93a9vLc3SbnuoKmkCNmm6Dy7LttG22b4BbuhPpxVlWjW6pu3sUDXRp+iqn8WRVmPNyPONyGYrVhh51L3ne/rLZRSueVIV1Mh2U1MFd30x5FojX+bWGLkVlmZjU5VR0YurWpRP7fu0tvdZrMQX2R5JaY6KfrK7WpGj4Kaum0EYyZ+wVBiaj/d9l2hAuslLnHy+kSOb7VgzBuiuYFOFEML5KjbV5U3UWalkJiK7dwzJrzXy435XnCfSLx+Komgn2rM18i7sH0Zuh1tMrY89iyRvj4rfrHjpY3ffMLm78pzU6AgMTovLdFdi2w/RYCm+yOmsjHCTFzv5zKl1ZLMpy8cA6T1aNhmTSii9TRtGyrdefjulY8GIPHbof5FJMyJ/AhYbeTwtKlXq00ixjgcxc+KzXU5pausrqUqw2IrLGdIRVozIx65z8gCcqJm4BqfTr0MjH0zKI5ttWa4QYa7l8qGsMx/vOmAkMlPT6cTU+plrjfy432WejJE/EwuzMU8r3YCj7UlhvHbMNDNswdBK3+iRFeOt4Xr0WBecBp2VkXX0/EOJH5HNLVk+ZxPfrCXzN/kwu7+w05HS8R1z/VPrx/0umTfHyJ+J9UaerjImT75Fy1fngCzJJuOjOGmxM3/ftxK9ixfeL8HDxc6ObDzgl+VrLk0VimxMNewC4dtBh8QroQuMHNncl+VGnj2/1m1XVsinIuPD4+Onpb8jl35Gnq+Ri2YPD2bNwKud00qf+63yp0iT2+q80qrxpyR0EJacRlmnlpCfWxYcfS7r0cM7Zt3DE8nYOh1g5Vu7Xhj2eluxFxr5Cdnck/VT6/ITjfFlzRbFlcjuKTiHPSHBX3bzxU1/Rz4xwThYb/Q4Ifks8He7QOcmD7vdFGy8ByP3xYZGPvncEBgCIwedVX+C4i5/D8rd6oYCRu6LLUfkq+NhOzBy0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZbByH1BNoIIwgAdFGIZjNwXZCOIIAzQQSGWwch9QTaCCMIAHRRiGYzcF2QjiCAM0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZbByH1BNoIIwgAdFGIZjNwXZCOIIAzQQSGWwch9QTaCCMIAHRRiGYzcF2QjiCAM0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZb58fvPf7x48eLFixevJ30xIvfFb26rQQJhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7otNsrEui6KsN2glVM29W/HCk5fpB4rBiw6fXCEvzkIj//4oenb742BbUez2x+N+V+RcguExPCgb6/L2zn5tAZ0Zn5xqU4WCMj2DuoxyXLtgcS/EO628yGvEMOc0miqcA4Yyxshn4SeVHsICI//+SO34++Pj+7J9zKWVr2BTHmPk9/DxOxl5fKpNFUIIPqrPCmHUZVqh61Lp7MxBL++bauVlXmnk7XvtMGPfYeQz8JRKD+FqIx/3ZIz8CViejdG4pa3TdVmEqm7HKr0BZqWtqcL5oxp/3h5VVHGM1G0PVdW2MlKU4+CybBttm+0biF2nO9VzSKgayvQE6gXqBrKhaqJPl6sudtz2YojC2v7P9wxVM3a0vukXZ42Ru0qlh3CtkS9za4zcCkuzsanKeCYyMsOoBrbv04ztzVGJL7I9kiLeWm28PZqpmxzkNXXdDMKkUWPs45cQL9VnqTAmxrCXy5xoQDTa2Mi3F0Mf1p9mcrvajBzN0YzxqjGAp1R6CFca+XG/K84T6ZcP0bp3tkbehf3DyO1wi6n1Whr9jG4XSuLc42QHmLP72DHHwvL/WHSqYqMvy0JhNFVIliLigXN86dJZGc1oHyKG4Yi/a6ipQtaifoYvy4pbPV+p9BAWjMhjh/4XmTQj8idgsZHH06JSpT6NF+t5U+5Csc72UraLtTsbcw9bySbW+12ikbmX6rO6TMdborG1ppk4YEwkG4ghXSNvIy/7dD4+3fSLs0whDlPpIVxr5Mf9LvNkjPyZWFivpTXDWaOlpOhdO7qaGbZgECZt7E81c6B8If0lWb7mkj/CpHTBadRB5QDx412nZ3I99D7OiHyJQjym0kO4/qn1436XzJtj5M/EeiNP1yOTJ9+KfOySPDs2Iz6Kk5ZF8/d9K9G7eOG9HWAPlkU7uqnh7FSl//lLs3zNpalCPrEx7ALh23lGvoEY5BH56VSXoSyDMFUw0vSLs3pVzksqPYRlvyOXfkaer5GLZg8PZs3Aa/CYbl2ePwnri6FqhuY4FX9KQgdhyWmUdVZ/s3PLgqPPl+du0sOP+bib6rOuTCcDr+h6CcvPaS9MG/lpQzEUw3uIfrFF2Dtv+qXByC3DX3bzxU1/Rz6RmYOVSbuZPFxE9QZ/t2sIqohBIZbByH2xoZFPPm5mByo2ZXpA8kA+oBDTYOS+2HJEvjoetoMyHeNn5Xs+KMQyGLkvyEYQQRigg0Isg5H7gmwEEYQBOijEMhi5L8hGEEEYoINCLIOR+4JsBBGEATooxDIYuS/IRhBBGKCDQiyDkfuCbAQRhAE6KMQyGLkvyEYQQRigg0Isg5H7gmwEEYQBOijEMhi5L8hGEEEYoINCLIOR+4JsBBGEATooxDIYuS/IRhBBGKCDQiyDkfuCbAQRhAE6KMQyGLkvyEYQQRigg0Isg5H7gmwEEYQBOijEMj9+//mPFy9evHjx4vWkL0bkvvjNbTVIIAzQQSGWwch9QTaCCMIAHRRiGYzcF2QjiCAM0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZbByH1BNoIIwgAdFGIZjNwXZCOIIAzQQSGWwch9QTaCCMIAHRRiGYzcF2QjiCAM0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZbByH1BNoIIwgAdFGIZjNwXZCOIIAzQQSGWwch9QTaCCMIAHRRiGYzcF2QjiCAM0EEhlsHIfUE2ggjCAB0UYhmM3BdkI4ggDNBBIZbByH1BNoIIwgAdFGIZjNwXZCOIIAzQQSGWwch9sUk21mVRlPUGrYSquXcrXtiqTNvpNTtn8hxg5Ja51si/P4qY3f6of/X9kcSIYcf9rsjZ7Y9aW7CQB2VjXd7e2a8txDPjk1NtqlD4KPdLhVGXSZJOXiu9Fyb7KG5uZb/cST8vy8rS4SeVHsICI48M9fujKIqPb+krMX40TPxKiYSFPMbI7+HjdyrE8ak2VQgh+Kg+K4w8uj51WUxMxqw38ktAU63sGYz8OlaVDk+p9BDWGXmyASN/ApZnYzQWait1XRahqquQbc5LXlOF80c1/ry93a9vLc39bnuoqraVuLmk6T64LNtG22b7BmLf6U71HBKqxkv5vo2R5xuatrPFDkq/7T71faLvXicC2Fg//lhj5K5S6SGsNvJ+C0b+BCzNxqYqo1oXm2Gbm9EIKc3Y3hyV+CLbI6nIbemMt0czdXIhjoKbum4GYVI9jn38EuKl+tzMyKMtfd8lGpj17YyA2Mg31o9HVo0BPKXSQ7itkcecZ9wn18jbiXkhWImEhdxiar2WhjKj2yPPnBUvfezuGyZ3HzvmWFj+H4tOVWz0ZbmDkWeD72yj/u10wOiN4xb68cgKhfhKpYdwEyMf8+yxeEbkD2OxkccTn9JQ5jRejudNuQuVN9tL2S4W4mzMPWwlmyjtd4lG5l6qz02NPF+9kDSjf6sEDOe4H6IfdyxTiMNUeghrjfy437VDZYz8CVhYr/Mxtm7A0fakHl47VJoZtmZEJZ5qZiEuFkZvZeRNFaLLqFzwqe6YDhjbyIj8LixSiMdUegirjPy430W/CsPIn4D1Rp4uLiZPvg0qePLs2Iz4KE5a48zf961E74ZLsNoaZ+c72alK//OX5iZGnv3EKO6vYbz+7ZyAsY0b6scRq1flvF/Au7Lud+SJz2ZL2ueBerJxtz+OhHVHUNbIWSS/Acsfdmtn1vPHfav+OeB8yJ6b41T8KQkdhCWnUdbpYDo/tyw4+nx57iY9/JiPu6k+t/kd+Xg3SuvZw2/jPprcPW5lY/14BCO3DH/ZzRc3/R35RGYOlhntZvJwRdQb/N0u0EEhlsHIfbGhkT/R40L4OGUaJkAhlsHIfbHliHx1PGwHZRp0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGUwcl+QjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWAYj9wXZCCIIA3RQiGUwcl+QjSCCMEAHhVgGI/cF2QgiCAN0UIhlMHJfkI0ggjBAB4VYBiP3BdkIIggDdFCIZTByX5CNIIIwQAeFWObH7z//8eLFixcvXrye9MWI3Be/ua0GCYQBOijEMhi5L8hGEEEYoINCLIOR+4JsBBGEATooxDIYuS/IRhBBGKCDQiyDkfuCbAQRhAE6KMQyGLkvyEYQQRigg0Isg5H7gmwEEYQBOijEMhi5L8hGEEEYoINCLIOR+4JsBBGEATooxDIYuS/IRhBBGKCDQiyDkfuCbAQRhAE6KMQyGLkvyEYQQRigg0Isg5H7gmwEEYQBOijEMhi5L8hGEEEYoINCLIOR+4JsBBGEATooxDIYuS/IRhBBGKCDQiyDkfuCbAQRhAE6KMQyGLkvyEYQQRigg0Isg5H7YpNsrMuiKOsNWglVc+9WvPB6ZbouNxChI15PIa/EtUb+/VF07PbHeV8d97vum4/v9PPIweA+PCgb71FUrzVyjF9jrTC2uXlLaKqgdKjQ3Vj7GjByyyww8ovlHve73n2P+93Zo4cfk7h/x/3+WzoabMNjsvEuFRQjvyWrhKFb6r1QVSWe0mPO80XAyC2z3Mjj94Ihd5uO+92oWWPkW7M8G+uymz1py2ddFqGqq5Btzi2zK59q/Hl7u1/fWlp5u+2hqtpW4uaSpvvgsmwbbZvtG2CQdjqtKtORPZ699XJthY4QL3ZThaKsm4suyvq8JT1CU/UdGDXRB0XCaLozGRynqQLdvRCM3DI3MXLRj78/LmPy4343NnOOkW/N0mxsqjLyytgM2yLZVCEqopH99nVeiS+yPRJHb2tvvL2pQqEaeRTc1HUzCKOgJ6y5w4t9MoRwvrRnez4lPSjPv9dlEcJZI00VirIss37N9NAfLLqj7Le2rbfHzDqeIflCMHLL3GJq/bjfRdPqw8h/3ar46LAdNuIW2VhLQ+HR7Wm9nY6XPnb3DZO7jx1zLAwuLL/DC0lfx3ddoWp6P28DBte9qUIhWXIbnBwhuSuMbtmy24PkmNEpMre+HIzcMmseduvMWx+R92Qr6Rj59izOxmRuUzbLdApdGPvOic92OaXePLZdNPKsuA9bYWK9Z6kw4iGucAOXmaw0ExLvFRtt+z7Zp/vQRwo+PnorydT6cjByy6yZWu9In2dTAvPBO0a+NQuzMS+MugFH2/MqfNVQe2bYghG5vtEjC4WROe9g6JwOgUcG5PIRLv2efx+vgQ8OIBwzbpQB+QowcsvcxMgHY+3vj34a/fsj2iHbHSPfmvVGni5Oi5Oi8eLmYBCsxUdx0hp5/n6whBqdWxw8XCPvkIZzLllu5Lnzttvnr5CLUzbD+ZrzpFA+IE8f2uhu+YZngo+vAyO3zI2M/F/24/B4/nz0C4x8e1YshY48Ll5ljwuf+tKbF86p+FMSKj213p9GWafj/vzcsuDoc1mPPxTvl/VT62PDYP2RdWViPfLfS1fVyfPx/SG7JoSpG2EyHpaAkVuGv+zmi5tm48S89GBBlHlsu9zkYTfDPMt52gUjtwxG7osNjXzycTMwxKo/MGB9cUKe1IerwMgtg5H7YssR+ep42A7KNOigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMtg5L4gG0EEYYAOCrEMRu4LshFEEAbooBDLYOS+IBtBBGGADgqxDEbuC7IRRBAG6KAQy2DkviAbQQRhgA4KsQxG7guyEUQQBuigEMv8H0Oh9V423VjyAAAAAElFTkSuQmCC" alt="" />

    2.但是上面的约定只适用于GET、POST、PUT和DELETE方法。其他的HTTP方法可以使用AcceptVerbs attribute匹配,前面的四种方法亦同样适用。举例:

public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}
public class ProductsController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { } // WebDAV method
[AcceptVerbs("MKCOL")]
public void MakeCollection() { }
}

    3.根据action名匹配(重写路由)。举例:

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

      3.1.根据上面的路由规则“api/products/details/1”的GET请求将会匹配:

public class ProductsController : ApiController
{
[HttpGet]
public string Details(int id);
}

      3.2.可以使用ActionName attribute重写action名。举例:

public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id);
}

        这样"api/products/thumbnail/id”就有两个匹配,分别对应GET和POST。

    4.如果一个方法不想被当作action调用,可以使用NonAction attribute,举例:

// Not an action method.
[NonAction]
public string GetPrivateData() { ... }

[翻译]ASP.NET Web API的路由的更多相关文章

  1. ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

      ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...

  2. [翻译]ASP.NET Web API 2 中的全局错误处理

    目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...

  3. 2.3属性在 ASP.NET Web API 2 路由

    路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...

  4. ASP.NET Web API编程——路由

    路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...

  5. [翻译]ASP.NET Web API 2入门

    原文:Getting Started with ASP.NET Web API 2 Step 1:新建一个Empty的Web API Project. Step 2:添加一个Model: public ...

  6. 2.4使用属性在 ASP.NET Web API 2 路由创建一个 REST API

    Web API 2 支持一种新型的路由,称为属性路由.属性路由的一般概述,请参阅属性路由 Web API 2 中.在本教程中,您将使用属性路由创建一个 REST API 集合的书.API 将支持以下操 ...

  7. ASP.NET WEB API 特性路由

    一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...

  8. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  9. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

随机推荐

  1. POJ1873 - Balance(01背包)

    题目大意 现有一个天平,它有C个挂钩和G个砝码,问有多少种方法可以使得天平平衡(砝码必须用完) 题解 其实就是让背包容量为0的方法有多少种方法,但是这样的话背包容量会出现负数,所以可以平移一下,背包容 ...

  2. Miller-Rabin素性测试(POJ3641)

    一.概念引入 在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差, ...

  3. 使用正则表达式匹配JS函数代码

    使用正则表达式匹配JS函数代码 String someFunction="init"; Pattern regex = Pattern.compile("function ...

  4. zepto下动画返回顶部

     function scroll(scrollTo, time) {                var scrollFrom = parseInt(document.body.scrollTop) ...

  5. Hibernate复合主键映射

    目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用 在日常开发中会遇到这样一种情况,数据库中的某张 ...

  6. excel重复数据

    =COUNTIF(H:H,H1)>1

  7. 自定义HttpHandler配置iis8.0

    配置环境,window8 ,iis8.0,.net Framework4.0,托管管道模式“经典” 步骤 (1)进入iis管理器,选中要设置的网站-->功能视图-->MIME类型--> ...

  8. android之自定义ViewGroup和自动换行的布局的实现

    viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上 找了下,没有相关的例子,但是找到了思路:自定义一个viewgr ...

  9. ODB 下载与安装 (Linux)

    http://www.codesynthesis.com/products/odb/download.xhtml Installing ODB on UNIX Introduction This gu ...

  10. 下载好一个android软件之后,怎样自动提示安装?

    最近在做毕设,里面牵涉到版本更新,当有新版本时可以下载新版本,下载完成之后提示安装.那么怎么实现下载完成之后提示安装呢? 直接上代码吧: File mFile = new File(Environme ...